Я пытаюсь настроить объект 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"));
но это терпит неудачу 🙁
Я еще не пробовал насмехаться __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'; } } ... ...