Passed
Branch 2.0 (d24509)
by Donald
02:04
created

Phake   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
c 0
b 0
f 0
dl 0
loc 84
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A makeVisible() 0 3 1
A expect() 0 6 1
A verifyExpectations() 0 4 2
A clearExpectations() 0 3 1
A strictMockWithConstructor() 0 8 1
A strictMock() 0 3 1
1
<?php namespace Chekote\Phake;
2
3
use Chekote\Phake\Proxies\VisibilityProxy;
4
use Chekote\Phake\Stubber\Answers\UnMockedResponseExceptionAnswer;
5
use Phake as BasePhake;
6
use Phake_CallRecorder_Recorder;
7
use Phake_ClassGenerator_MockClass;
8
use Phake_IMock;
9
use Phake_Stubber_AnswerCollection;
10
use RuntimeException;
11
12
/**
13
 * Extends Phake to add strict mock functionality.
14
 *
15
 * A strict mock will throw an Exception stating the class and method name of any method that is called without
16
 * its response being mocked. This is to assist in strict London style TDD, whereby only explicitly mocked out
17
 * methods are allowed to be invoked.
18
 */
19
abstract class Phake extends BasePhake
20
{
21
    /** @var Expectation[] */
22
    protected static $expectations;
23
24
    public static function clearExpectations()
25
    {
26
        self::$expectations = [];
27
    }
28
29
    /**
30
     * Declare an expectation for a mock.
31
     *
32
     * This method combines the behavior of when() and verify() to create an expectation. The returned expectation
33
     * should be utilized in the same way that the Stubber from when() would be used. The expectations will be
34
     * recorded and can be verified via verifyExpectations(), which should typically be invoked in tearDown().
35
     *
36
     * @param  Phake_IMock $mock  the mock.
37
     * @param  int         $count the expected call count.
38
     * @return Expectation the expectation.
39
     */
40
    public static function expect(Phake_IMock $mock, int $count)
41
    {
42
        $expectation = new Expectation($mock, $count);
43
        self::$expectations[] = $expectation;
44
45
        return $expectation;
46
    }
47
48
    /**
49
     * Verifies all expectations.
50
     *
51
     * @throws RuntimeException if a method has not been set for the expectation.
52
     * @throws RuntimeException if args have not been set for the expectation.
53
     */
54
    public static function verifyExpectations()
55
    {
56
        foreach (self::$expectations as $expectation) {
57
            $expectation->verify();
58
        }
59
    }
60
61
    /**
62
     * Increases allows calling private and protected instance methods on the given mock.
63
     *
64
     * @param  Phake_IMock     $mock
65
     * @return VisibilityProxy $mock
66
     */
67
    public static function makeVisible(Phake_IMock $mock)
68
    {
69
        return new VisibilityProxy($mock);
70
    }
71
72
    /**
73
     * Creates a strict mock.
74
     *
75
     * @param  string      $className the name of the class to mock.
76
     * @return Phake_IMock the mocked class instance.
77
     */
78
    public static function strictMock(string $className)
79
    {
80
        return self::mock($className, new Phake_Stubber_AnswerCollection(new UnMockedResponseExceptionAnswer()));
81
    }
82
83
    /**
84
     * Creates a strict mock and calls the real classes constructor.
85
     *
86
     * This method creates a mock that is somewhere between what Phake::mock and Phake::partialMock would create. The
87
     * returned mock behaves exactly the same as what Phake::mock would return, except that it calls the constructor
88
     * of the mocked class (as Phake::partialMock does). However, the returned mock will NOT thenCallParent() for every
89
     * mocked method in the way that a partial mock would.
90
     *
91
     * @param  string      $className the name of the class to mock.
92
     * @param  array       ...$args   arguments for the classes constructor.
93
     * @return Phake_IMock the mocked class instance.
94
     */
95
    public static function strictMockWithConstructor(string $className, ...$args)
96
    {
97
        return self::getPhake()->mock(
98
            $className,
99
            new Phake_ClassGenerator_MockClass(self::getMockLoader()),
100
            new Phake_CallRecorder_Recorder(),
101
            new UnMockedResponseExceptionAnswer(),
102
            $args
103
        );
104
    }
105
}
106