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

最佳答案

即使测试方法有错误和失败,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 ...
}

07-28 10:34