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

Zend framework 在Zend Framework中使用模拟对象测试视图渲染,zend-framework,phpunit,Zend Framework,Phpunit,我有一个控制器操作,它调用从web服务获取JSON对象的模型。JSON对象通过mapper类转换为PHP对象,并在我的视图中使用 我想做的是编写一个模拟web服务响应的单元测试,调用映射器类将响应映射到PHP对象,然后在视图中使用该对象。这样,我可以使用assertQueryContentContains()检查值是否正确映射到我的对象并在我的视图中填充 最好的方法是什么 到目前为止,我已经在单元测试课上学到了: $view->search_session = new Zend_Sessi

我有一个控制器操作,它调用从web服务获取JSON对象的模型。JSON对象通过mapper类转换为PHP对象,并在我的视图中使用

我想做的是编写一个模拟web服务响应的单元测试,调用映射器类将响应映射到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()
。另外,如果您没有使用与实际环境中相同的设置代码,那么它有点违背了测试的目的。

您需要确定这是什么类型的测试。现在它试图成为一个单元测试。通过阅读你在问题中所说的内容

如果您没有像在真实环境中那样使用相同的设置代码,那么这有点违背了测试的目的

听起来你想做一个系统测试

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

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


还有一个基本原则需要记住,一段代码的依赖性越强,为它设置测试的工作就越多。现在,您的视图脚本有很多依赖项,这就是为什么对其进行单元测试需要更多的工作。

您需要确定这是什么类型的测试。现在它试图成为一个单元测试。通过阅读你在问题中所说的内容

如果您没有像在真实环境中那样使用相同的设置代码,那么这有点违背了测试的目的

听起来你想做一个系统测试

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

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


还有一个基本原则需要记住,一段代码的依赖性越强,为它设置测试的工作就越多。现在,您的视图脚本有很多依赖项,这就是为什么对其进行单元测试需要做更多的工作。

感谢您的回复。你回答了我的其他问题,像往常一样,你帮了我很大的忙。你完全正确的观点是,你意识到了不应该发生的事情。考虑到你的建议,我重新考虑了一些事情。对注册表的引用在布局中,结果证明我根本不需要实例化布局来测试视图。允许控制器处理会话意味着,在我的单元测试中,我可以设置一个视图变量来表示应该存在的内容。最后,我做了一个简单得多的测试。再次感谢。任何试图测试这些代码的人都是我的朋友;)。我很高兴能帮上忙,我知道这一切都很艰难,所以我只是想传播自动化测试的爱。谢谢你的回复。你回答了我的其他问题,像往常一样,你帮了我很大的忙。你完全正确的观点是,你意识到了不应该发生的事情。考虑到你的建议,我重新考虑了一些事情。对注册表的引用在布局中,结果证明我根本不需要实例化布局来测试视图。允许控制器处理会话意味着,在我的单元测试中,我可以设置一个视图变量来表示应该存在的内容。最后,我做了一个简单得多的测试。再次感谢。任何试图测试这些代码的人都是我的朋友;)。我很高兴能帮上忙,我知道这一切都很艰难,所以我只是想传播自动化测试的爱。