【问题标题】:Testing Zend Controllers with Single-Instance Sessions使用单实例会话测试 Zend 控制器
【发布时间】:2011-06-02 23:40:53
【问题描述】:

我正在尝试在我的测试中使用 Zend_Test_PHPUnit_ControllerTestCase 并且遇到了困难。

我的应用程序引导程序实例化了一个库类,该类管理对名为“LiveData”的 Zend_Session_Namespace 的访问。 LiveData 维护 Current User、Current Organsation 等的数据数组。实例化后,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('/') 再次运行引导程序......但我无法想象为什么会这样。 (我们为什么要让它运行两次?)如果您能阐明我的困境,我将不胜感激!

【问题讨论】:

    标签: unit-testing zend-framework phpunit


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢大卫。你是对的。我现在已经移除了这个标志并将其放在待办事项列表中。这对我提出了一个关于 Zend 和 PHPUnit 的“操作理论”的更大问题。我将尝试将其放入另一个 SO 问题中。
    • 是的,每个测试方法都被视为一个新请求,就像它是从index.php 进入前端控制器一样。您需要确保您在引导程序中所做的任何事情都可以被清除或不会阻止对它的第二次调用成功。
    • 了解这一点很有帮助,尽管我仍然不是 100% 清楚 Zend 和 PHPUnit 如何交互。我可以理解 PHPUnit 保持它自己的状态,或者它的测试应用程序的状态。在我看来,被测系统会在测试方法之间保持其状态(就像它不会在通过 index.php 进行的调用之间保持不变一样,除非它故意保持在 Zend_Session 等对象中)。
    • 在正常操作下,来自浏览器的每个点击index.php 的请求都发生在一个单独的系统进程中。上一个请求期间创建的所有对象都将从内存中删除,并启动一个新的 PHP 进程。在 PHPUnit 中运行测试时,所有测试一个接一个地在同一个进程中运行。这留下了 Zend 创建的所有对象,并且告诉它不允许再次创建相同名称空间的标志存储在不会被清除的静态(本质上是全局)变量中。
    • 您可以使用 PHPUnit 的 --process-isolation 标志在单独的进程中运行每个测试,但它们的运行速度会慢得多。最好找到清除测试之间遗留的任何全局状态的方法。
    猜你喜欢
    • 2013-11-26
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2017-10-04
    • 2012-09-21
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多