тест интеграции контроллера: как мне протестировать вызов метода на объекте

#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.