使用单实例会话测试Zend控制器



我试图在测试中使用Zend_Test_PHPUnit_ControllerTestCase,但遇到了困难。

我的应用程序引导程序实例化了一个库类,该类管理对名为"LiveData"的Zend_Session_Namespace的访问。LiveData维护当前用户、当前组织等的数据数组。一旦实例化,LiveData对象就会存储在注册表中。

当我实例化LiveData时,我将singleInstance设置为true,即new Zend_Session_Namespace('LiveData', true)。这是为了减少关于谁对LiveData做什么的潜在困惑。

不管怎样,这似乎很好用。我浏览网站、登录、注销等,我的会话数据的行为正如我所期望的那样。

然而,在尝试测试时,我收到一条消息,上面写着"此命名空间已经存在会话命名空间对象"。

我的测试在每个测试文件中引导如下:

public function setUp()
{
    $this->bootstrap = new Zend_Application(APPLICATION_ENV, 
            APPLICATION_PATH . '/configs/application.ini');
    parent::setUp();
}

这是Netbeans在那里放置的默认脚手架。阅读Zend_Test文档,这对我来说似乎很好

当我在测试中调度控制器时,问题似乎出现了,如下所示:

public function testIndexIsDefaultAction()
{
    $this->dispatch('/');
    // assertions
    $this->assertController('Index');
    $this->assertAction('index');
}

我认为测试的setUp()方法导致我的应用程序引导程序运行(并创建LiveData的副本)。然后$this->dispatch('/')再次运行bootsrap。。。我无法想象为什么会出现这种情况。(我们为什么要让它运行两次?)如果你能了解我的困境,我将不胜感激!

setUp()方法仅告诉Zend如何调用引导程序,这是在调用dispatch()时完成的。但是,您的引导程序将针对每个测试方法运行。由于您要告诉Zend防止具有相同命名空间的Zend_Session_Namespace的多个实例,因此第二个测试方法将失败。

Zend_Session_Namespace的源代码中查找重置标志的方法。如果它存在,请在调用应用程序引导程序之前将其添加到测试引导程序中。

最新更新