Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPUnit Mock Change the expectations later

I have a simple use case. I want to have a setUp method which will cause my mock object to return a default value:

$this->myservice
        ->expects($this->any())
        ->method('checkUniqueness')
        ->will($this->returnValue(true));

But then in some tests, I want to return a different value:

$this->myservice
        ->expects($this->exactly(1))
        ->method('checkUniqueness')
        ->will($this->returnValue(false));

I've used GoogleMock for C++ in the past and it had "returnByDefault" or something to handle that. I couldn't figure out if this is possible in PHPUnit (there is no api documentation and the code is difficult to read through to find what I want).

Now I can't just change $this->myservice to a new mock, because in setup, I pass it into other things that need to be mocked or tested.

My only other solution is that I lose the benefit of the setup and instead have to build up all of my mocks for every test.

like image 968
Matt Avatar asked Apr 15 '12 20:04

Matt


1 Answers

Continue building the mock in setUp() but set the expectation separately in each test:

class FooTest extends PHPUnit_Framework_TestCase {
  private $myservice;
  private $foo;
  public function setUp(){
    $this->myService = $this->getMockBuilder('myservice')->getMock();
    $this->foo = new Foo($this->myService);
  }


  public function testUniqueThing(){
     $this->myservice
        ->expects($this->any())
        ->method('checkUniqueness')
        ->will($this->returnValue(true));

     $this->assertEqual('baz', $this->foo->calculateTheThing());
  }

  public function testNonUniqueThing(){
     $this->myservice
        ->expects($this->any())
        ->method('checkUniqueness')
        ->will($this->returnValue(false));

     $this->assertEqual('bar', $this->foo->calculateTheThing());

  }


}

The two expectations will not interfere with each other because PHPUnit instantiates a new instance of FooTest to run each test.

like image 143
bdsl Avatar answered Sep 20 '22 12:09

bdsl