Я знаю, что такое внедрение зависимостей и зачем его использовать (лучше внедрить класс, чем использовать новое ключевое слово, потому что это как бы делает невозможным его тестирование позже). Я собираюсь рассказать о способах написания контроллеров в Laravel.
Способ 1) Допустим, у меня есть следующая функция в контроллере, и я хочу ее протестировать.
public function index() {
$allActors = \App\Actor::all();
foreach($allActors as $actor){
$actor->name = "gio";
}
return $allActors;
}
Как видите, контроллер и модель тесно связаны. У меня вопрос: почему я не могу протестировать этот метод? Я просмотрел издевательства над Laravel и думаю, что это можно проверить. Что бы я сделал, так это перед вызовом метода индексации я бы поиздевался над \App\Actor и тем, что он должен вернуть. Почему бы мне не последовать этой идее?
Способ 2)
protected $actor;
public function __construct(\App\Actor $actor){
$this->actor = $actor;
}
public function index() {
$allActors = $this->actor->all();
foreach($allActors as $actor){
$actor->name = "gio";
}
return $allActors;
}
Теперь вы думаете, что это можно проверить? как? Одна вещь, о которой я могу подумать, - это перед созданием нового контроллера я бы создал новый класс, который расширяет модель Actor и переопределяет его функции, в данном случае функцию all(), и получаю результаты из файла.
Главный вопрос: почему я не могу протестировать это в первом и втором примере? Какой лучше для DI? Похоже, что второй вариант - это DI, но я просмотрел документацию Laravel и думаю, что первый пример все еще можно высмеять. Но я также читал, что над моделями Eloquent нельзя издеваться. Я ищу полное представление обо всем этом.






Я бы переместил вызов
\App\Actor::all()в отдельный метод в классе контроллера, имитировал бы контроллер и этот метод, а затем протестировал бы макет вместо экземпляра самого контроллера. Ваш второй вариант включает создание фиктивных экземпляров и изменение статического метода на нестатический, поэтому я бы определенно не пошел по этому пути.