Как мне выполнить модульное тестирование контроллера Zend Action? - PullRequest
4 голосов
/ 22 сентября 2011

Мне нужно быстро собрать хорошее программное обеспечение на PHP и использовать Zend Framework. Я пытаюсь сделать это в стиле TDD, потому что его люди, более опытные, чем я, сказали мне, что это лучший способ быстрой сборки при сохранении управляемости вашего кода.

Итак, я взял книгу по phpunit и пошел хорошо, и после первоначальных хлопот она начинает ускоряться, и код все еще хорош. Мне нравится, как мои объекты могут быть проверены индивидуально.

Однако существует одна серьезная проблема при тестировании контроллера Zend Action. Пакет zend_test предоставляет способ проверить это. Но это, кажется, чтобы проверить все приложение сразу. Похоже, я не могу точно заглушить или высмеять какие-либо репозитории или внедрить любые другие зависимости. Так что я не смог протестировать их настолько широко, как я мог бы сделать с остальной частью проекта, и это видно.

Я пытался решить эту проблему. Но все, что я мог найти в сети, это Zend_test способ сделать это.

Мне бы хотелось узнать ваше мнение по этому поводу. Может быть, я просто пытаюсь что-то сделать или, может быть, есть более хороший способ разработать модульный тест для контроллеров Zend Action.

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Роб Аллен написал очень хорошую статью о тестировании действий Zend Controller с PHPUnit.При этом используется Zend_Test_PHPUnit_ControllerTestCase, который загружает все приложение и тестирует ответ.

PHPUnit и функциональное тестирование в целом не подходят для тестирования контроллеров.И наоборот, контроллеры не подходят для модульного тестирования.Под этим я подразумеваю, что концепция модульного тестирования не имеет смысла с концепцией уровня контроллера, и контроллеры, как правило, конструируются таким образом, что по своей природе их трудно тестировать.Предлагаем использовать Селен .Это проверяет ответ от контроллера (поэтому в большинстве случаев действительно проверяет View ).Помимо тестов Selenium, вы также должны проводить модульное тестирование своих моделей и остальной части своей библиотеки.Это настолько пуленепробиваемый, насколько вы можете получить на уровне контроллера.

1 голос
/ 22 сентября 2011

В Zend 1 контроллер - это нормальный класс. Вы можете создать его экземпляр, вызвать его методы (например, заменить репозиторий по умолчанию на макет PHPUnit вашего репозитория:

class MyController extends Zend_Controller_Action
{
   public functioni init()
   {
      $this->repository = new MyRepository();
   }

   public function setRepository($repository)
   {
      $this->repository = $repository;
   }

   public function saveAction()
   {
      $dataToWrite = manipulate in some way $this->getRequest()->getParams();
      $this->repository->update($dataToWrite, ...);
   }
}

Но вы также должны ввести запрос и отправить его, чтобы получить ответ.

Лично для контроллеров я предпочитаю писать функциональные тесты, а не модульные тесты (с Zend_Test). Это медленнее, вам, вероятно, понадобится база данных sqlite в памяти и так далее. Но вы будете знать, действительно ли ваше приложение работает: вы можете выполнить модульное тестирование каждого класса, но если фабрика, которая связывает ваши объекты, неверна, вы продолжите получать зеленую панель PHPUnit с неработающим приложением.

...