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'));
Другие вопросы по тегам