在Zend Framework中使用模拟对象测试视图渲染

时间:2012-03-23 16:00:45

标签: zend-framework phpunit

我有一个控制器操作,它调用从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()。此外,如果您没有使用与在真实环境中相同的设置代码,那么它会破坏测试目的。

1 个答案:

答案 0 :(得分:3)

您需要确定这是什么类型的测试。现在它正试图成为一个单元测试。从阅读你在问题中说的话,

  如果您没有使用与在真实环境中相同的设置代码,那么它会破坏测试的目的

听起来你想要进行系统测试。

如果您想进行系统测试,请完全开始使用use dispatch()。您必须自动化数据库/数据存储区以同时导入和删除测试数据。

如果您正在尝试进行单元测试,那么您的视图脚本会让您感到困难。视图脚本不应该真正了解布局。如果您可以修复它,那么您可以清理该代码。您的视图脚本不应该知道Zend_Registry。不要忘记Zend_Registry只是隐藏在模式名称后面的全局变量。我还要说它不应该知道Zend_Session。这些类提供的任何数据都应该由控制器或视图助手设置。如果你可以解决这些问题,你可以清理那些代码。

还有一个基本原则要记住,一段代码的依赖关系越多,为它设置测试的工作就越多。现在你的视图脚本有很多依赖性,这就是为什么单元测试它的工作要多得多。