Я выполняю модульное тестирование, и в моем хранилище используется следующий метод:
/**
* @param int|Collection $id
* @return MyModel|Collection|null
*/
public function find($id);
Я пробовал это:
$this->package_repo = Mockery::mock(PackageRepositoryInterface::class);
$this->app->instance('Package', $this->package_repo);
// ...
$this->ticket_repo->shouldReceive("find")->with(collect([]))->andReturn(/*...*/);
//...
echo $this->ticket_repo->find(collect([])); // Failed here.
Тест сразу не прошел, и я думаю, что это потому, что 2 коллекции в операторе ожидания shouldReceive
и фактическом операторе find
являются различными объектами.
Если я хочу издеваться над поведением $this->ticket_repo->find($ids)
, что мне делать?
Вернее, если бы был лучший способ разработать тестируемый алгоритм, как бы это было? Потому что я хотел бы, чтобы все идентификаторы, которые я хочу найти, были в массиве и были бы собраны в один SQL-запрос выбора, а не в несколько сотен отдельных, для повышения производительности.
Также спрашивают здесь: https://laracasts.com/discuss/channels/testing/mocking-findcollection-in-repository-pattern-in-laravel-with-mockery#