我很想知道在测试类__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文档无法获得更多信息,你能否帮我解读哪一个是好的做法?
答案 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