PHPUnit - создание объектов Mock, которые будут действовать как заглушки для свойств - PullRequest
17 голосов
/ 22 июля 2010

Я пытаюсь настроить объект 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"));

но это ужасно не получается: - (

Ответы [ 2 ]

9 голосов
/ 29 июля 2010

Я еще не пробовал использовать __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'));

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

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

4 голосов
/ 29 июля 2011

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

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';
    }
}
... ... 
...