Как установить переменную в фиктивном объекте - PullRequest
8 голосов
/ 09 марта 2010

Есть ли способ установить переменную уровня класса в фиктивном объекте?

У меня есть фиктивный объект, подобный этому:

$stub = $this->getMock('SokmeClass', array('method'));
$stub->expects($this->once())
         ->method('method')
         ->with($this->equalTo($arg1));

Выиграй реальный класс, есть переменная, которую нужно установить, чтобы он работал правильно. Как я могу установить эту переменную в фиктивном объекте?

Ответы [ 4 ]

15 голосов
/ 06 февраля 2014

Вот что у меня работает:

$stub = $this->getMock('SomeClass');
$stub->myvar = "Value";
5 голосов
/ 13 сентября 2010

Не знаю, почему это работает, но мне кажется. Если вы используете магический метод __get в качестве одного из переопределенных методов, например

$mock = $this->getMock('Mail', array('__get'));

Вы можете тогда вы можете успешно сделать

$mock->transport = 'smtp';
3 голосов
/ 09 марта 2010

Идея заглушки состоит в том, чтобы заменить зависимость тестовым двойником, предлагающим тот же интерфейс метода, который (необязательно) возвращает сконфигурированные возвращаемые значения. Таким образом, SUT может работать с двойной, как это было зависимостью. Если вам нужно конкретное возвращаемое значение из заглушки, просто скажите ему, что он должен возвращать, например ::

// Create a stub for the SomeClass class.
$stub = $this->getMock('SomeClass');

// Configure the stub.
$stub->expects($this->any())
     ->method('doSomething')
     ->will($this->returnArgument(0));

$stub->doSomething('foo'); // returns foo

См. http://www.phpunit.de/manual/current/en/test-doubles.html

0 голосов
/ 22 июля 2014

Я собираюсь предложить следующее, учитывая обсуждение в ваших комментариях к @ Gordon.

Я думаю, вам нужно понять, что вы действительно тестируете геттеры / сеттеры, а не реальную логику, которую вы реализуете.

Возможно, вам следует разбить код на более мелкие куски, которые вы можете проверить.

Затем приступите к проверке данных, которые вы ожидаете от меньших методов. (Вы можете проверить защищенные методы.)

В реальном коде вы можете вызывать эти меньшие куски (методы) и заполнять нужный объект другой публичной функцией (которую не следует тестировать, потому что установка и получение переменных для объекта должны быть простыми, чтобы их даже не стоило тестировать). .)

...