Search code examples
phpunit-testingmockingphpunittemplate-method-pattern

Testing template method design pattern implementation with PHPUnit Mock Objects


Suppose I have code with template method design pattern implementation. And I want to test sequence and counts of methods calls in my template method. I try to use PHPUnit mocks. My source code looks like this:

class Foo {

    public function __construct() {}

    public function foobar() {
        $this->foo();
        $this->bar();
    }

    protected function foo() {}

    protected function bar() {}
}


class FooTest extends PHPUnit_Framework_TestCase {

    public function testFoo() {
        $fooMock = $this->getMock('Foo', array('foo', 'bar'));

        $fooMock->foobar();

        $fooMock->expects($this->once())->method('foo');
        $fooMock->expects($this->once())->method('bar');
    }
} 

As a result I have such error:

PHPUnit_Framework_ExpectationFailedException : 
Expectation failed for method name is equal to <string:foo> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

Is it possible to count method calls in such scenario using mock objects?


Solution

  • It is just my stupid mistake. Wrong mock object creation sequence:

    // ...
    
    public function testFoo() {
        $fooMock = $this->getMock('Foo', array('foo', 'bar'));
        $fooMock->expects($this->once())->method('foo');  // (!) immediately after          
        $fooMock->expects($this->once())->method('bar');  // mock object instantiation
    
        $fooMock->foobar();
    }