9

因此,每次我在 PHPUnit 中遇到意外异常(例如由于完整性检查而无法插入数据库)时,我的测试都会失败,并且它会在没有运行tearDownAfterClass()函数的情况下出错。这将使我的数据库处于混乱状态,因此我必须手动清理它。有没有办法确保tearDownAfterClass()始终执行?

4

2 回答 2

7

tearDownAfterClass即使测试方法出现错误和失败,PHPUnit 也会调用。抛出异常时不会调用它。setUpBeforeClass为了确保清理您的数据库,请将清理代码移动到您从中调用的新方法tearDownAfterClasssetUpBeforeClass.

function FooTest extends PHPUnit_Framework_TestCase
{
    static function setUpBeforeClass() {
        try {
            ... setup code that might fail ...
        }
        catch (Exception $e) {
            self::cleanupDatabase();
            throw $e;  // so the tests will be skipped
        }
    }

    static function tearDownAfterClass() {
        self::cleanupDatabase();
    }

    static function cleanupDatabase() {
        ... clean ...
    }

    ... test methods ...
}
于 2012-09-03T20:08:27.160 回答
2

您可以覆盖该功能

protected function onNotSuccessfulTest(Exception $e) 

例如;

$this->tearDownAfterClass();
throw $e;
于 2012-09-03T10:55:55.510 回答