Silverstripe 3.7 单元测试 - tearDownOnce() 和 setUpOnce() 不会触发

问题描述

银条 3.7.6、PHP 7.3、PHPUnit 4.8

我们有一堆现有的单元测试,它们使用 SapphireTest->setUpOnce() 和 SapphireTest->tearDownOnce()。后者用于在完成后销毁测试数据库。这就是我们发现这些方法没有触发的原因。

简单的模拟测试

<?PHP

class MyTest extends SapphireTest {

    protected $usesDatabase = true;

    public function setUp()
    {
        echo "setup \n";
        parent::setUp();
    }

    public function tearDown()
    {
        echo "teardown \n";
        parent::tearDown();
    }

    public function setUpOnce()
    {
        echo "setup once \n";
        parent::setUpOnce();
    }

    public function tearDownOnce()
    {
        echo "teardown once \n";
        parent::tearDownOnce();
    }

    function testSomething()
    {
        // My test
    }

}

测试运行时的输出

PHPUnit 4.8.36 由 Sebastian Bergmann 和贡献者编写。

.setup 拆解

时间:6.38 秒,内存:80.50MB

好的(1 个测试,0 个断言)

是否需要在测试中完成某些操作,以便在每个文档块的整个测试类的开始和结束时触发这些函数

更新:

请参阅下面的对话。有人建议我改用 PHPUnit 的 setUpBeforeClass 和 tearDownAfterClass 方法。这些按预期发射。但是,它们是静态方法,因此我无法访问 $this 以在类中使用支持 SapphireTest 或自定义方法。所以我不得不使用这些 PHPUnit 方法来实例化它们所在的测试类的实例,然后调用我现有的 setUpOnce 和 tearDownOnce 方法。我在这里使用了 late static binding 的 static() 关键字,因为我可能会将这些调用移动到父类中以供我的所有测试使用。有点 hacky,但它似乎有效。

假设我上面的测试代码,下面是要添加的:

public static function setUpBeforeClass() {
    $object = new static();
    $object->setUpOnce();
}

public static function tearDownAfterClass() {
    $object = new static();
    $object->tearDownOnce();
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)