微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。