不一致的单元测试 - 在测试套件中失败,通过分离

时间:2011-03-14 21:26:05

标签: unit-testing zend-framework phpunit integration-testing

我对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, phlyTesting Zend Framework Controllers « Federico Cargnelutti

解决方案:

我已经确定了这个问题(小睡一会儿之后)。问题不在单元测试设置中,而是在测试代码中。

我根据模块名称使用不同的ACL对象。使用哪一个是由静态调用操作助手确定的,它将结果缓存在私有静态变量中以加快速度。此缓存仅在测试套件中运行时执行。我只需要为此代码进行更多单元测试:)

(我很抱歉这个垃圾邮件,但我已经坚持了一天,我希望其他人经历过类似的Heisenbug,并进行单元测试)

1 个答案:

答案 0 :(得分:1)

在发送每个操作之前,您可以尝试清除requestresponse个对象,如下所示:

$this->resetRequest()
     ->resetResponse()
     ->dispatch('/news/index/index');