Издевательство, забывающее установку по умолчанию при использовании shouldReceive для одного и того же метода, но с разными аргументами

Мы экспериментируем со странным поведением издевательство (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()

Это насмешливое ограничение? Это плохой подход с нашей стороны, может быть, испытательный запах?

заранее спасибо

1

Решение

Это издевательское ограничение. Когда вы устанавливаете новое ожидание для метода, 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();
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]