У меня есть действие контроллера, которое вызывает модель, которая выбирает объект 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()
.Кроме того, это как бы отрицательно сказывается на цели тестирования, если вы не используете такой же установочный код, как в реальной среде.