我一直在做单元测试,我遇到了这个奇怪的坏问题。
我正在使用我的一些服务/映射器进行用户身份验证测试。
我现在一起跑了大约307次测试。只有当我一次性运行它们时才会发生这种情况。
我尝试只实例化一个Zend_Application对象,并将其用于我的所有测试。我只是实例化它来处理我的类的数据库连接,会话和自动加载。
这是问题所在。
在测试行的某处,调用Zend_Session_SaveHandler_DbTable的__destruct方法。我不知道为什么?但确实如此。
__destruct方法会将对会话对象的任何写入都无效,因为它们被标记为只读。
我不知道为什么要调用destruct方法。
在我的身份验证测试之前,它被称为许多测试。如果我单独运行每个测试文件夹都没有问题。只有当我尝试运行所有307次测试时才会这样。我确实有一些测试可以进行数据库工作但是我的代码没有关闭数据库连接或破坏保存处理程序。
有没有人对为什么会发生这种情况以及为什么我的Zend_Session_SaveHandler_DbTable被破坏有任何想法?这与默认情况下的生命周期有关吗?
答案 0 :(得分: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中的一个缺陷,这个缺陷以前是未知的,并且有一些方法可以修复它。
答案 1 :(得分:1)
这是一个老问题,但我遇到了同样的问题并找到了解决方案here。我认为这是解决问题的正确方法。
Zend_Session::$_unitTestEnabled = true;