#cakephp #phpunit #cakephp-3.0
#cakephp #phpunit #cakephp-3.0
Вопрос:
Как я могу настроить тест контроллера, чтобы проверить, вызывается ли doSomething
метод в $ entity
public function doSomething($id)
{
$entity = $this->Entities->get($id);
$entity->doSomething();
}
мой EntitesControllerTest
выглядит следующим образом:
public function testDoSomething()
{
$this->setupUser();
$this->get('/entities/do-something/1');
$this->assertResponseOk();
}
Я полагаю, мне придется работать с макетом объекта сущности, но как я могу это сделать, первое, что делает контроллер, — это запись поверх $entity
переменной?
Комментарии:
1. Довольно просто: не выполняйте бизнес-логику в контроллерах. Либо выполните надлежащий DDD, либо используйте методы в объектах таблицы cakephp, или, что еще лучше, создайте свои собственные объекты, которые выполняют все операции, а затем просто передайте необходимую информацию из запроса этим методам.
2. Вы тестируете свою модель / объект и его метод в функциональных тестах внутри вашего уровня модели. Затем вы тестируете результат высокого уровня вашего уровня контроллера в целом только на 2-м шаге. Не смешивайте их.
3. @mark: У меня есть тест для
doSomething
метода моей сущности. Но я хочу убедиться, что этот метод вообще вызывается. В приведенной выше настройке я мог бы удалить строку$entity->doSomething();
из контроллера без сбоя в тестировании контроллера (и мои тесты объектов также не потерпели бы неудачу).4. @burzum: Почему вы считаете приведенный выше пример «бизнес-логикой в контроллере»? Считается ли запретным вызов методов на объектах в контроллере?
5. @DavidAlbrecht технически вы можете это сделать, но это не очень хороший способ сделать это. Очевидно, что здесь происходит бизнес-операция, которая не должна происходить в контроллере. $this-> Service-> doSomething($ id); должен инкапсулировать всю операцию. Это усложняет тестирование, оно связывает вашу бизнес-логику с контроллером, и вы не можете повторно использовать его в других местах. На самом деле хорошая реализация делает всю вашу бизнес-логику или уровень домена независимым от любой платформы. Но это сложно архивировать с помощью Cake.