在PHPUnit中如何强制tearDownAfterClass()在意外异常的情况下运行

时间:2012-09-03 03:32:31

标签: php unit-testing phpunit

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

2 个答案:

答案 0 :(得分:7)

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

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 ...
}

答案 1 :(得分:2)

您可以覆盖功能

protected function onNotSuccessfulTest(Exception $e) 
例如

;

$this->tearDownAfterClass();
throw $e;