NoMatchingExpectationException даже с $this-> everything()
Я пишу модульный тест для метода контроллера Laravel, но я получаю NoMatchingExpectationExceptions независимо от того, что я делаю с ->with(...)
, Тестируемый код:
public function destroy($id) {
$foo = FooService::foo($id); //returns a Foo object (an Eloquent model)
$fooCollection = new Collection(array($foo));
$response = FooService::archive($fooCollection);
return Response::json($response);
}
Модульный тест:
public function testArchiveSingle() {
$foo = Mockery::mock('Foo', array('id' => 1));
$fooCollection = new \Illuminate\Database\Eloquent\Collection();
$fooCollection->add($foo);
FooService::shouldReceive('foo')->once()
->with(1)
->andReturn($foo);
//here's the shouldReceive that's throwing the error:
FooService::shouldReceive('archive')->once()
->with($this->anything())
->andReturn(array('result'=>'here'));
$response = $this->action('DELETE', 'FoosController@destroy',
array('site' => 12345, 'foos' => 1),
array());
$this->assertResponseOk();
$this->assertTrue($response->headers->contains('Content-Type', 'application/json'));
//other tests that are proprietary in nature go here
}
в ->with()
Я пытался пройти в $fooCollection
, $this->instanceOf('Collection')
, $this->instanceOf('\Illuminate\Database\Eloquent\Collection')
и несколько других вещей. Я также пытался изменить $fooCollection
определение просто new Collection
,
Когда я запускаю тесты, я получаю:
Mockery \ Exception \ NoMatchingExpectationException: не найден соответствующий обработчик для Mockery_1_FooService::archive(Illuminate\Database\Eloquent\Collection). Либо метод был неожиданным, либо его аргументы не соответствуют ни одному ожидаемому списку аргументов для этого метода
Когда я удаляю ->with(...)
в трудном случае следует получить тест работает нормально, но теряет значение, так как не обнаружит (теоретическую) ошибку, которая случайно заархивирует слишком много.
1 ответ
Вы должны использовать Mockery::any()
соответствовать любому аргументу. Собственная фиктивная библиотека PHPUnit использует $this->anything()
, Смотрите руководство.
FooService::shouldReceive('archive')->once()
->with(Mockery::any())
->andReturn(array('result'=>'here'));