我有一个控制器操作,它调用从Web服务获取JSON对象的模型。 JSON对象通过映射器类转换为PHP对象,并在我的视图中使用。
我想做的是编写一个单元测试来模拟Web服务响应,调用我的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()
调度控制器操作一样?
或者,我应该以某种方式嘲笑通常会返回Web服务响应并以某种方式将其注入我的控制器的模型类?
似乎我的工作有点太难了,因为必须重新创建我的环境,好像我已经调用了$this->dispatch()
。此外,如果您没有使用与在真实环境中相同的设置代码,那么它会破坏测试目的。
答案 0 :(得分:3)
您需要确定这是什么类型的测试。现在它正试图成为一个单元测试。从阅读你在问题中说的话,
如果您没有使用与在真实环境中相同的设置代码,那么它会破坏测试的目的
听起来你想要进行系统测试。
如果您想进行系统测试,请完全开始使用use dispatch()。您必须自动化数据库/数据存储区以同时导入和删除测试数据。
如果您正在尝试进行单元测试,那么您的视图脚本会让您感到困难。视图脚本不应该真正了解布局。如果您可以修复它,那么您可以清理该代码。您的视图脚本不应该知道Zend_Registry。不要忘记Zend_Registry只是隐藏在模式名称后面的全局变量。我还要说它不应该知道Zend_Session。这些类提供的任何数据都应该由控制器或视图助手设置。如果你可以解决这些问题,你可以清理那些代码。
还有一个基本原则要记住,一段代码的依赖关系越多,为它设置测试的工作就越多。现在你的视图脚本有很多依赖性,这就是为什么单元测试它的工作要多得多。