Тестирование рендеринга представлений с помощью фиктивных объектов в Zend Framework - PullRequest
0 голосов
/ 23 марта 2012

У меня есть действие контроллера, которое вызывает модель, которая выбирает объект JSON из веб-службы.JSON-объект преобразуется в PHP-объект через класс mapper и используется в моем представлении.

Я хотел бы написать модульный тест, который проверяет ответ веб-службы и вызывает мой класс mapper длясопоставить ответ с моим объектом PHP, а затем использует этот объект в моем представлении.Таким образом, я могу использовать assertQueryContentContains(), чтобы проверить, правильно ли отображаются значения для моего объекта и заполнены ли они в моем представлении.

Каков наилучший способ сделать это?

Пока что у меня есть это в моем классе модульного теста:

$view->search_session = new Zend_Session_Namespace('search');

Zend_Registry::set('is_mobile', false);

$view = new Zend_View();
$view->setScriptPath(APPLICATION_PATH . '/views/scripts/');
$view->addHelperPath(APPLICATION_PATH . '/views/helpers');

$layout = Zend_Layout::getMvcInstance()->setLayoutPath(APPLICATION_PATH . '/layouts/scripts/')->setLayout('layout-internal');

$layout->setView($view);

$mapper = new ListingDetailMapper();
$listing = $mapper->map($this->_createMockListing(), new ListingDetail());

$view->listing = $listing;

$this->getResponse()->setBody($layout->render());

$this->assertQueryContentContains('h3.fn', 'Test Business');

Проблема, с которой я столкнулсяэто то, что мне нужно настроить все вручную, что обычно было бы в моей начальной загрузке или в файле конфигурации, если бы я отправлял запрос в обычном режиме.

Есть ли способ внедрить мой фиктивный объект в мое представление,поэтому я могу отобразить представление автоматически, как если бы я отправил действие контроллера, используя $this->dispatch()?

Или я должен каким-то образом высмеивать класс модели, который обычно возвращает ответ веб-службы, и каким-то образом вводить его вмой контроллер?

Кажется, что я слишком усердно работаю, потому что мне приходится заново создавать свое окружение, как если бы я звонил $this->dispatch().Кроме того, это как бы отрицательно сказывается на цели тестирования, если вы не используете такой же установочный код, как в реальной среде.

1 Ответ

3 голосов
/ 24 марта 2012

Вам нужно решить, что это за тест.Сейчас он пытается быть модульным тестом.Из прочтения того, что вы говорите в своем вопросе:

, это отчасти сводит на нет цель тестирования, если вы не используете такой же установочный код, как в реальной среде

звучит так, будто вы хотите провести системный тест.

Если вы хотите выполнить системный тест, тогда начните полностью использовать use dispatch ().Вам придется автоматизировать вашу базу данных / хранилище данных для одновременного импорта и удаления тестовых данных.

Если вы пытаетесь выполнить модульный тест, тогда ваш скрипт просмотра усложняет вам задачу.Скрипт вида не должен знать о макете.Если вы можете это исправить, то вы можете очистить этот код.Ваш скрипт вида не должен знать о Zend_Registry.Не забывайте, что Zend_Registry - это просто глобальная переменная, скрывающаяся за именем шаблона.Я также сказал бы, что он не должен знать о Zend_Session.Любые данные, предоставляемые этими классами, должны быть установлены контроллером или помощником вида.Если вы можете исправить их, вы можете очистить этот код.

Существует также фундаментальный принцип, который следует иметь в виду, что чем больше зависимостей в фрагменте кода, тем больше будет работы по настройке тестирования дляЭто.Прямо сейчас ваш скрипт вида имеет много зависимостей, и поэтому для его юнит-тестирования требуется больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...