PHPUnit – создание объектов Mock для работы в качестве заглушек для свойств

Я пытаюсь настроить объект Mock в PHPunit, чтобы возвращать значения для разных свойств (к которым обращаются с помощью функции __get)

Пример:

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

Я пытаюсь издеваться над этим, используя:

 $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")); Л $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")); а $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")); 

но это терпит неудачу 🙁

Solutions Collecting From Web of "PHPUnit – создание объектов Mock для работы в качестве заглушек для свойств"

Я еще не пробовал насмехаться __get, но, возможно, это сработает:

 // 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')); Л // 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')); а // 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')); 

Я уже использовал $ this-> at () в тесте, и он работает (но не является оптимальным решением). Я получил это от этого протектора:

Как я могу заставить PHPUnit MockObjects возвращать разные значения на основе параметра?

Это должно работать:

 class Test extends \PHPUnit_Framework_TestCase { ... function testSomething() { $mockObject = $this->getMock("OrigionalObject"); $mockObject ->expects( $this->any() ) ->method('__get') ->will( $this->returnCallback('myMockGetter')); ... } ... } function myMockGetter( $classPropertyName ) { switch( $classPropertyName ) { case 'ParameterA': return 'ValueA'; case 'ParameterB': return 'ValueB'; } } ... ...