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

时间:2014-10-07 10:43:04

标签: phpunit

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

我知道每次测试都会调用set / teardown,如果我将objec创建代码放入其中,它会有什么用处吗?例如

// 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文档无法获得更多信息,你能否帮我解读哪一个是好的做法?

2 个答案:

答案 0 :(得分:18)

在运行每个测试之前调用

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

答案 1 :(得分:5)

正如我刚刚发现的那样,实现默认的类构造函数而不是setupBeforeClass()方法会破坏@dataProvider注释(可能是各种注释),从而产生一个" Missing参数"任何参数化测试的例外。

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

public function __construct()替换public static function setUpBeforeClass()可以摆脱异常。所以它支持setupBeforeClass()方法而非常规构造函数。

PHPUnit版本4.5.0