3

我一直在进行单元测试,但遇到了这个奇怪的坏问题。

我正在使用我的一些服务/映射器进行用户身份验证测试。

我现在总共进行了大约 307 次测试。只有当我在一批中运行它们时才会真正发生这种情况。

我尝试只实例化一个 Zend_Application 对象并将它用于我的所有测试。我只实例化它来处理数据库连接、会话和类的自动加载。

这是问题所在。

沿着测试线的某个地方调用 Zend_Session_SaveHandler_DbTable 的 __destruct 方法。我不知道为什么?但确实如此。

__destruct 方法将使对我的会话对象的任何写入都无用,因为它们被标记为只读。

我不知道为什么要调用 destruct 方法。

在我的身份验证测试之前,它会被调用很多测试。如果我单独运行每个测试文件夹,则没有问题。只有当我尝试运行所有 307 测试时。我确实有一些测试可以完成数据库工作,但我的代码没有关闭数据库连接或破坏保存处理程序。

有没有人知道为什么会发生这种情况以及为什么我的 Zend_Session_SaveHandler_DbTable 被破坏了?这与默认情况下的生命周期有什么关系吗?

4

2 回答 2

1

我认为发生的事情是 PHPUnit 正在做垃圾收集。每当我运行 307 测试时,垃圾收集器都必须运行,它可能出于某种原因破坏了 Zend_Session_SaveHandler_DbTable。

这可以解释为什么在运行较少的测试时它没有被破坏。

或者也许是 PHP 进行垃圾收集,这更有意义。

无论哪种方式,我当前的解决方案是为每个测试类创建一个新的 Zend_Application 对象,以便该类中的所有测试都有一个新的 zend_application 对象可以使用。

这里有一些有趣的信息。

我在 savehandler 的 __destruct 方法中放置了一个 echo 语句。

该方法被调用 ( X + 1 ) 次,其中 X 是我运行的测试数。如果我运行 50 次测试,我得到 51 次回声,307 次测试然后是 308 次回声,等等。

这是有趣的部分。如果我只运行几个测试,回声都会在测试运行结束时出现。如果我尝试运行所有 307 次测试,在我假设为 90 次测试之后会出现 90 次回声。其余的回声将在其余测试结束时出现。回声的数量再次为 X + 1,或者在本例中为 308。

所以,这就是我假设这与 PHPUnit 调用的 tearDown 方法或 PHP 垃圾收集器有关。也许 PHPUnit 在拆卸时会调用垃圾收集器。谁知道,但我很高兴我现在可以正常工作,因为我的测试都事先通过了。

如果你们中的任何人有更好的解决方案,请告诉我。也许我在我的代码、phpunit 或 zend 中发现了一个以前不为人知的缺陷,并且有一些方法可以修复它。

于 2011-06-08T02:53:05.737 回答
1

这是一个老问题,但我刚刚遇到同样的问题并在这里找到了解决方案。我认为这是解决它的正确方法。

Zend_Session::$_unitTestEnabled = true;
于 2013-04-26T07:31:30.920 回答