У меня есть большое количество тестов в TestCase. Я хочу установить фиктивный объект, который возвращает одно и то же значение в большинстве тестов, но в некоторых тестах я бы хотел настроить это значение.
Моя идея состояла в том, чтобы создать set_up()
метод (я не смог установить ожидания внутри автоматически вызываемого setUp()
) и вручную вызывать его в начале каждого теста. В этом методе я бы установил возвращаемое значение по умолчанию, затем в нескольких тестах, в которых необходимо настроить возвращаемое значение, я бы вызвал ожидаемый во второй раз и, надеюсь, перезаписал возвращаемое значение по умолчанию. Это не работает, возвращаемое значение не перезаписывается.
Вот упрощенный пример:
<?php
class SomeClass {
function someMethod() {
}
}
class SomeTest extends PHPUnit_Framework_TestCase {
private $mock;
function set_up() {
$this->mock = $this->getMockBuilder('SomeClass')
->disableOriginalConstructor() // This is necessary in actual program
->getMock();
$this->mock->expects($this->any())
->method('someMethod')
->will($this->returnValue(1));
}
function test() {
$this->set_up();
$this->mock->expects($this->any())
->method('someMethod')
->will($this->returnValue(2));
$this->assertEquals(2, $this->mock->someMethod());
}
}
Кажется, что это должно быть возможно от чтения Как сбросить ложный объект с помощью PHPUnit.
PHPUnit макет с несколькими вызовами Expected () не отвечает на мой вопрос.
Я использую phpUnit 4.2
Вы можете передать аргументы методу set_up, чтобы он мог настроить макет при необходимости:
function set_up($someMethodReturnValue = 1) {
$mock = $this->getMockBuilder('SomeClass')
->disableOriginalConstructor() // This is necessary in actual program
->getMock();
$mock->expects($this->any())
->method('someMethod')
->will($this->returnValue($someMethodReturnValue));
return $mock;
}function test() {
$mock = $this->set_up(2);
$this->assertEquals(2, $this->mock->someMethod());
}
Вы можете дополнительно улучшить метод set_up (). В конце концов, вы можете создать класс создания Mock, если есть много опций.
Других решений пока нет …