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

时间:2011-06-02 23:40:54

标签: unit-testing zend-framework phpunit

我正在尝试在测试中使用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 ...但我无法想象为什么会出现这种情况。 (为什么我们要它跑两次?)如果你能解决我的困境,我会非常感激!

1 个答案:

答案 0 :(得分:2)

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

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