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

Silverstripe 3.7单元测试-tearDownOnce()和setUpOnce()不会触发,silverstripe,Silverstripe,Silverstripe 3.7.6、PHP7.3、PHPUnit 4.8 我们有一系列现有的单元测试,它们使用SapphireTest->setUpOnce()和SapphireTest->tearDownOnce()。后者用于在完成后销毁测试数据库。这就是为什么我们发现这些方法没有开火 模拟的简单测试 <?php class MyTest extends SapphireTest { protected $usesDatabase = true; public f

Silverstripe 3.7.6、PHP7.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的内部结构,而不是SapphireTest提供给您的,例如
setUpBeforeClass
teardowneafterclass
@wmk是所有测试都是绿色的。即使如此,setUpOnce和TeardDownOnce似乎都不会触发。@robbie averill谢谢,这两个都会触发。但是,由于它们是静态的,因此它们无法访问$this以访问SapphireTest中的方法。因此,我必须使用这些方法来创建测试类的实例,然后调用我已有的setUpOnce和tearDownOnce方法。有点迂回,但它是有效的。我会详细更新我的问题。干杯
public static function setUpBeforeClass() {
    $object = new static();
    $object->setUpOnce();
}

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