Насмешливая находка ($ collection) в шаблоне репозитория в Laravel с Mockery - PullRequest
0 голосов
/ 10 июня 2019

Я выполняю модульное тестирование, и в моем хранилище используется следующий метод:

/**
 * @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#

1 Ответ

0 голосов
/ 13 июня 2019

Вы должны издеваться над конкретным классом, а не над интерфейсом.Поскольку вы не указали имя, я просто догадываюсь:

$mock = Mockery::mock(TicketRepo::class);
$this->app->swap('PackageRepo', $mock);

Так что теперь, когда кто-то запрашивает экземпляр по имени интерфейса, он получит пародию.

...