我对Zend Framework控制器进行了单元测试,扩展了Zend_Test_PHPUnit_ControllerTestCase
。
测试正在调度一个动作,该动作转发到另一个动作,如下所示:
// AdminControllerTest.php
public testAdminAction()
$this->dispath('/admin/index/index');
// forwards to login page
$this->assertModule('user');
$this->assertController('profile');
$this->assertController('login');
$this->assertResponseCode(401);
}
// NewsControllerTest.php
public testIndexAction()
{
$this->dispatch('/news/index/index');
$this->assertModule('news');
$this->assertController('index');
$this->assertController('index');
$this->assertResponseCode(200);
}
当它们作为单独的测试运行时,两个测试都在通过
当我在同一个测试套件中运行它们时,第二个会失败
而是调度/news/index/index
先前的请求(用户模块)。
如何追踪此错误?看起来我在应用程序的某个地方有一些全局状态,但我无法调试它。如何在套件中的测试之间转储对象? setUpBefore/AfterClass
是静态的,因此没有关于对象实例的数据。
我知道这是一种猜测的问题。这里很难提供可靠的数据,因为它们会占用很多位置,所以请随时询问详细信息。
整个单元测试设置或多或少类似于:Testing Zend Framework MVC Applications - phly, boy, phly或Testing Zend Framework Controllers « Federico Cargnelutti。
我已经确定了这个问题(小睡一会儿之后)。问题不在单元测试设置中,而是在测试代码中。
我根据模块名称使用不同的ACL对象。使用哪一个是由静态调用操作助手确定的,它将结果缓存在私有静态变量中以加快速度。此缓存仅在测试套件中运行时执行。我只需要为此代码进行更多单元测试:)
(我很抱歉这个垃圾邮件,但我已经坚持了一天,我希望其他人经历过类似的Heisenbug,并进行单元测试)
答案 0 :(得分:1)
在发送每个操作之前,您可以尝试清除request
和response
个对象,如下所示:
$this->resetRequest()
->resetResponse()
->dispatch('/news/index/index');