Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPUnit - creating Mock objects to act as stubs for properties

I'm trying to configure a Mock object in PHPunit to return values for different properties (that are accessed using the __get function)

Example:

class OriginalObject {
 public function __get($name){
switch($name)
 case "ParameterA":
  return "ValueA";
 case "ParameterB":
  return "ValueB";
 }
}

I'm trying to mock this using:

$mockObject = $this->getMock("OrigionalObject");

$mockObject    ->expects($this->once())
    ->method('__get')
    ->with($this->equalTo('ParameterA'))
    ->will($this->returnValue("ValueA"));

$mockObject    ->expects($this->once())
    ->method('__get')
    ->with($this->equalTo('ParameterB'))
    ->will($this->returnValue("ValueB"));

but this fails horribly :-(

like image 991
Tim Avatar asked Jul 21 '10 23:07

Tim


1 Answers

I haven't tried mocking __get yet, but maybe this will work:

// getMock() is deprecated
// $mockObject = $this->getMock("OrigionalObject");
$mockObject = $this->createMock("OrigionalObject");

$mockObject->expects($this->at(0))
    ->method('__get')
    ->with($this->equalTo('ParameterA'))
    ->will($this->returnValue('ValueA'));

$mockObject->expects($this->at(1))
    ->method('__get')
    ->with($this->equalTo('ParameterB'))
    ->will($this->returnValue('ValueB'));

I've already used $this->at() in a test and it works (but isn't an optimal solution). I got it from this tread:

How can I get PHPUnit MockObjects to return different values based on a parameter?

like image 90
koen Avatar answered Oct 12 '22 18:10

koen