Мы экспериментируем со странным поведением издевательство (0.9.2) в то время как Symfony контроллер, который использует несколько параметров запроса, полученных с помощью Запрос оказание услуг. Мы используем PHPUnit (3.7) в качестве основы тестирования.
То, как мы подходим к TDD, использует настроить метод создания макетов и их настройки с помощью по умолчанию() поэтому они могут предоставить нейтральный сценарий счастливого потока. Затем в каждом методе тестирования мы уточняем наши ожидания насчет поведения.
Я выделил проблему в проверке концепции только для того, чтобы облегчить анализ. Вот так.
Это сам тестовый класс:
class FooTest extends \PHPUnit_Framework_TestCase
{
private $request;
public function setUp()
{
$this->request = \Mockery::mock('Symfony\Component\HttpFoundation\Request');
$this->request->shouldReceive('get')->with('a')->andReturnNull()->byDefault();
$this->request->shouldReceive('get')->with('b')->andReturnNull()->byDefault();
}
public function test_bar_checks_request_a_parameter()
{
$this->request->shouldReceive('get')->with('a')->andReturn('a')->once();
$foo = new Foo($this->request);
$foo->bar();
}
}
И это проверенный класс:
use Symfony\Component\HttpFoundation\Request;
class Foo
{
private $request;
function __construct(Request $request)
{
$this->request = $request;
}
public function bar()
{
$a = $this->request->get('a');
$b = $this->request->get('b');
}
}
В тесте test_bar_checks_request_a_parameter Я бы ожидал бар() метод, чтобы получить «а» при вызове получить’) по просьбе издеваться при получении ноль при звонке получить ( «б») вместо.
Но вместо этого мы получаем эту ошибку:
No matching handler found for Mockery_0_Symfony_Component_HttpFoundation_Request::get("b").
Который, кажется, говорит, что Запрос макет забыл набор, который мы сделали для получить ( «б») вызов
shouldReceive('get')->with('b')->andReturnNull()->byDefault()
Это насмешливое ограничение? Это плохой подход с нашей стороны, может быть, испытательный запах?
заранее спасибо
Это издевательское ограничение. Когда вы устанавливаете новое ожидание для метода, Mockery отключает все byDefault()
ожидания для этого метода, даже если они были установлены с различными аргументами.
Существует открытый вопрос относительно этого:
https://github.com/padraic/mockery/issues/353
Вы можете решить эту проблему, используя массив значений и функцию, которая будет вычислять возвращаемое значение каждый раз. Хитрость в том, чтобы сделать массив доступным из тестовых методов, чтобы вы могли изменить возвращаемые значения:
class FooTest extends \PHPUnit_Framework_TestCase
{
private $request;
private $get_return_values = array();
public function setUp()
{
$this->request = \Mockery::mock('Symfony\Component\HttpFoundation\Request');
$this->request->shouldReceive('get')->andReturnUsing(function($arg) {
return isset($this->get_return_values[$arg]) ? $this->get_return_values[$arg] : null;
});
}
public function test_bar_checks_request_a_parameter()
{
$this->get_return_values['a'] = 'a';
$foo = new Foo($this->request);
$foo->bar();
}
}
Других решений пока нет …