在 phpunit 中 __construct 与 setup 有什么区别?

问题描述 投票:0回答:3

我很想知道在测试类 __construct 中创建对象是一种很好的做法,还是我们应该始终使用 setup/teardown 方法(或 setUpBeforeClass/tearDownAfterClass 方法)?

我知道每个测试都会调用 set/teardown 这一事实,所以如果我将对象创建代码放入其中,会有什么好处吗?例如

//mytestclass.php

class MyTestClass extends PHPUnit_Framework_TestCase
{
   
    private $obj;
    
    protected function setUp()
    {
        $this->obj = new FooClass();

    }

   public testFooObj()
   {
     //assertions for $this->obj
   }


   ...

}

如果我像这样在构造函数中创建对象,可能会出现什么问题:

class MyTestClass extends PHPUnit_Framework_TestCase
    {
       
        private $obj;
        
        protected function __construct()
        {
            $this->obj = new FooClass();
    
        }
    
       public testFooObj()
       {
         //assertions for $this->obj
       }
    
   
       ...
    
    }

我尝试谷歌搜索以及 PHPUnit 文档无法获得太多信息,你能帮我了解哪一个是好的做法吗?

phpunit
3个回答
32
投票

setUp()
在运行每个测试之前都会被调用。
__construct()
当你的类被实例化时发生。因此,如果您有多个测试并且它们使用本地属性并修改它们,则使用
setUp()
您可以确保它们在运行每个测试之前是相同的。与
setUp()
相反的是
tearDown()
,您可以确保每次测试后都清理测试数据。


9
投票

正如我刚刚发现的,实现默认的类构造函数而不是 setupBeforeClass() 方法会破坏 @dataProvider 注释(可能是所有类型的注释),从而为任何参数化测试产生“缺少参数”异常。

Missing argument 1 for AppBundle\Tests\Service\InvitationVerifierTest::testDireccionInvalida()

public function __construct()
替换为
public static function setUpBeforeClass()
可消除异常。所以,与常规构造函数相比,更喜欢 setupBeforeClass() 方法。

PHPUnit 版本 4.5.0


0
投票

setupBeforeClass()
/
@beforeClass
setup()
/
@before
相比,使用构造函数发生在一个奇怪的地方。

如果您的测试有很多依赖项,通常的想法是构造函数中的内容只创建一次。但在 PHPUnit 中,每次测试和迭代 dataProvider 时都会调用构造函数。这意味着所有依赖项都会一次又一次地创建。

如果您有一个抽象测试用例来处理特定命名空间的事物,那么您最终可能会得到非常不一致甚至破坏的结果。

一般来说,似乎建议不要使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.