搜索会产生几个关于捕获致命异常的问题,但这个问题是针对使用 SimpleTest 的。(我知道 SimpleTest 已经过时了,但是让 PHP-Unit 在我的配置上工作是另一个问题)。
我试图让 tearDown() 方法即使在出现致命异常时也能正常工作,因为我在设置过程中在数据库中创建了一些测试行,并在拆卸过程中将它们删除。但是当 SimpleTest 遇到致命异常时,teardown() 永远不会运行。
尽管有致命的异常,有没有办法让 tearDown() 运行?
搜索会产生几个关于捕获致命异常的问题,但这个问题是针对使用 SimpleTest 的。(我知道 SimpleTest 已经过时了,但是让 PHP-Unit 在我的配置上工作是另一个问题)。
我试图让 tearDown() 方法即使在出现致命异常时也能正常工作,因为我在设置过程中在数据库中创建了一些测试行,并在拆卸过程中将它们删除。但是当 SimpleTest 遇到致命异常时,teardown() 永远不会运行。
尽管有致命的异常,有没有办法让 tearDown() 运行?
有一个可以使用的“register_shutdown_fction”钩子:
register_shutdown_function(array($this, 'shutdownHandler'));
在“shutdownHandler”中你可以写:
error_get_last() && $this->tearDown();
当发生致命错误时,PHP 进程将终止——这意味着无法让同一个 PHP 进程执行任何类型的附加代码,因为它不再存在。
这也意味着:
你应该解决这个问题:你的应用程序中的一个致命错误是坏的;当然,很高兴您通过自动化测试检测到它——但下一步是让它消失;-)
由于您不能在同一个已死的进程中运行 PHP 代码,我看到的唯一解决方案是启动另一个进程,以运行您的清理代码。
基本思想是:
当然,这意味着在运行所有测试之后,清理只会进行一次;但我想总比没有好。
现在,如何以自动化的方式做到这一点?
最简单的解决方案可能是使用运行两个命令的 shell 脚本;像这样的东西,我会说:
#!/bin/sh
php /.../launch-tests.php
php /.../cleanup.php
并通过启动该 shell 脚本来运行您的测试。