Completed
Pull Request — master (#638)
by Peter
03:41
created

TestListener   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 28
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 2
lcom 0
cbo 3
dl 0
loc 28
ccs 11
cts 11
cp 1
rs 10
c 2
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
A endTest() 0 18 2
1
<?php
2
/**
3
 * Mockery
4
 *
5
 * LICENSE
6
 *
7
 * This source file is subject to the new BSD license that is bundled
8
 * with this package in the file LICENSE.txt.
9
 * It is also available through the world-wide-web at this URL:
10
 * http://github.com/padraic/mockery/blob/master/LICENSE
11
 * If you did not receive a copy of the license and are unable to
12
 * obtain it through the world-wide-web, please send an email
13
 * to [email protected] so we can send you a copy immediately.
14
 *
15
 * @category   Mockery
16
 * @package    Mockery
17
 * @copyright  Copyright (c) 2010 Pádraic Brady (http://blog.astrumfutura.com)
18
 * @license    http://github.com/padraic/mockery/blob/master/LICENSE New BSD License
19
 */
20
21
namespace Mockery\Adapter\Phpunit;
22
23
class TestListener extends \PHPUnit_Framework_BaseTestListener
24
{
25
    /**
26
     * endTest is called after each test and checks if \Mockery::close() has
27
     * been called, and will let the test fail if it hasn't.
28
     *
29
     * @param  PHPUnit_Framework_Test $test
30
     * @param  float                  $time
31
     */
32 2
    public function endTest(\PHPUnit_Framework_Test $test, $time)
33
    {
34
        try {
35
            // The self() call is used as a sentinel. Anything that throws if
36
            // the container is closed already will do.
37 2
            \Mockery::self();
38 2
        } catch (\LogicException $_) {
39 1
            return;
40
        }
41
42 1
        $e = new \PHPUnit_Framework_ExpectationFailedException(sprintf(
43 1
            "Mockery's expectations have not been verified. Make sure that \Mockery::close() is called at the end of the test. Consider using %s\MockeryPHPUnitIntegration or extending %s\MockeryTestCase.",
44 1
            __NAMESPACE__,
45
            __NAMESPACE__
46 1
        ));
47 1
        $result = $test->getTestResultObject();
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface PHPUnit_Framework_Test as the method getTestResultObject() does only exist in the following implementations of said interface: AbstractTest, BankAccountTest, BankAccountWithCustomExtensionTest, BeforeAndAfterTest, BeforeClassAndAfterClassTest, ChangeCurrentWorkingDirectoryTest, ConcreteTest, ConcreteWithMyCustomExtensionTest, CountTest, CoverageClassExtendedTest, CoverageClassTest, CoverageFunctionParenthesesTest, CoverageFunctionParenthesesWhitespaceTest, CoverageFunctionTest, CoverageMethodOneLineAnnotationTest, CoverageMethodParenthesesTest, CoverageMethodParenthesesWhitespaceTest, CoverageMethodTest, CoverageNamespacedFunctionTest, CoverageNoneTest, CoverageNotPrivateTest, CoverageNotProtectedTest, CoverageNotPublicTest, CoverageNothingTest, CoveragePrivateTest, CoverageProtectedTest, CoveragePublicTest, DataProviderDebugTest, DataProviderFilterTest, DataProviderIncompleteTest, DataProviderSkippedTest, DataProviderTest, DependencyFailureTest, DependencySuccessTest, EmptyTestCaseTest, ExceptionInAssertPostConditionsTest, ExceptionInAssertPreConditionsTest, ExceptionInSetUpTest, ExceptionInTearDownTest, ExceptionInTest, ExceptionMessageRegExpTest, ExceptionMessageTest, ExceptionStackTest, ExceptionTest, Extensions_PhptTestCaseTest, Extensions_RepeatedTestTest, Failure, FailureTest, FatalTest, Foo_Bar_Issue684Test, Framework_AssertTest, Framework_BaseTestListenerTest, Framework_ConstraintTest, Framework_Constraint_JsonMatchesTest, Framework_Constraint_Jso...rrorMessageProviderTest, Framework_SuiteTest, Framework_TestCaseTest, Framework_TestFailureTest, Framework_TestImplementorTest, Framework_TestListenerTest, Hamcrest\AbstractMatcherTest, Hamcrest\Arrays\IsArrayContainingInAnyOrderTest, Hamcrest\Arrays\IsArrayContainingInOrderTest, Hamcrest\Arrays\IsArrayContainingKeyTest, Hamcrest\Arrays\IsArrayContainingKeyValuePairTest, Hamcrest\Arrays\IsArrayContainingTest, Hamcrest\Arrays\IsArrayTest, Hamcrest\Arrays\IsArrayWithSizeTest, Hamcrest\Collection\IsEmptyTraversableTest, Hamcrest\Collection\IsTraversableWithSizeTest, Hamcrest\Core\AllOfTest, Hamcrest\Core\AnyOfTest, Hamcrest\Core\CombinableMatcherTest, Hamcrest\Core\DescribedAsTest, Hamcrest\Core\EveryTest, Hamcrest\Core\HasToStringTest, Hamcrest\Core\IsAnythingTest, Hamcrest\Core\IsCollectionContainingTest, Hamcrest\Core\IsEqualTest, Hamcrest\Core\IsIdenticalTest, Hamcrest\Core\IsInstanceOfTest, Hamcrest\Core\IsNotTest, Hamcrest\Core\IsNullTest, Hamcrest\Core\IsSameTest, Hamcrest\Core\IsTest, Hamcrest\Core\IsTypeOfTest, Hamcrest\Core\SetTest, Hamcrest\FeatureMatcherTest, Hamcrest\MatcherAssertTest, Hamcrest\Number\IsCloseToTest, Hamcrest\Number\OrderingComparisonTest, Hamcrest\StringDescriptionTest, Hamcrest\Text\IsEmptyStringTest, Hamcrest\Text\IsEqualIgnoringCaseTest, Hamcrest\Text\IsEqualIgnoringWhiteSpaceTest, Hamcrest\Text\MatchesPatternTest, Hamcrest\Text\StringContainsIgnoringCaseTest, Hamcrest\Text\StringContainsInOrderTest, Hamcrest\Text\StringContainsTest, Hamcrest\Text\StringEndsWithTest, Hamcrest\Text\StringStartsWithTest, Hamcrest\Type\IsArrayTest, Hamcrest\Type\IsBooleanTest, Hamcrest\Type\IsCallableTest, Hamcrest\Type\IsDoubleTest, Hamcrest\Type\IsIntegerTest, Hamcrest\Type\IsNumericTest, Hamcrest\Type\IsObjectTest, Hamcrest\Type\IsResourceTest, Hamcrest\Type\IsScalarTest, Hamcrest\Type\IsStringTest, Hamcrest\UtilTest, Hamcrest\Xml\HasXPathTest, IncompleteTest, InheritanceA, InheritanceB, InheritedTestCase, IniTest, IsolationTest, Issue1021Test, Issue1149Test, Issue1216Test, Issue1265Test, Issue1330Test, Issue1335Test, Issue1337Test, Issue1348Test, Issue1351Test, Issue1374Test, Issue1437Test, Issue1468Test, Issue1471Test, Issue1472Test, Issue1570Test, Issue2158Test, Issue244Test, Issue322Test, Issue433Test, Issue445Test, Issue498Test, Issue503Test, Issue523Test, Issue578Test, Issue581Test, Issue74Test, Issue765Test, Issue797Test, Mockery\Adapter\Phpunit\MockeryTestCase, MultiDependencyTest, My\Space\ExceptionNamespaceTest, NamespaceCoverageClassExtendedTest, NamespaceCoverageClassTest, NamespaceCoverageCoversClassPublicTest, NamespaceCoverageCoversClassTest, NamespaceCoverageMethodTest, NamespaceCoverageNotPrivateTest, NamespaceCoverageNotProtectedTest, NamespaceCoverageNotPublicTest, NamespaceCoveragePrivateTest, NamespaceCoverageProtectedTest, NamespaceCoveragePublicTest, NoArgTestCaseTest, NoTestCases, NotExistingCoveredElementTest, NotPublicTestCase, NotVoidTestCase, NothingTest, OneTest, OneTestCase, OutputTestCase, OverrideTestCase, PHPUnit_Framework_IncompleteTestCase, PHPUnit_Framework_SkippedTestCase, PHPUnit_Framework_TestCase, PHPUnit_Framework_Warning, RequirementsClassBeforeClassHookTest, RequirementsTest, Runner_BaseTestRunnerTest, StackTest, Success, TemplateMethodsTest, TestError, TestIncomplete, TestSkipped, TestWithTest, ThrowExceptionTestCase, ThrowNoExceptionTestCase, TwoTest, Util_ConfigurationTest, Util_GetoptTest, Util_GlobalStateTest, Util_RegexTest, Util_TestDox_NamePrettifierTest, Util_TestTest, Util_XMLTest, WasRun.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
48 1
        $result->addFailure($test, $e, $time);
49 1
    }
50
}
51