单元测试 - 当我的实例化变化时,可以/我应该使用setUp和tearDown吗?

时间:2014-04-25 13:55:37

标签: unit-testing tdd phpunit

假设我有一个在构造函数中使用参数的类,如下:

$var = new MyClass(1, 2, 3);

我的各种测试取决于传递给类的参数。

我注意到PHPUnit有setUp()和tearDown()方法,在执行每个测试之前,通常在构造函数没有参数时可以用来实例化一个类。

有没有办法在我的测试工具中使用setUptearDown方法来处理我的示例中的类,或者我只是在每次测试中单独设置我的类,就像我一直在在做什么?

我更多地问这个问题,以确定我没有错过任何关于如何正确使用setUptearDown的内容。

3 个答案:

答案 0 :(得分:2)

我同意inf3rno的答案:如果构造函数需要参数,则不应使用setUp。

也许你可以利用另一个功能:dataProviders。它们允许您为同一测试定义多个数据集:

public function sumExamples()
{
    return array(
       array(1, 2, 3),
       array(1, -1, 0),
       array(-1, -2, -3)
    );
}

/**
 * @dataProvider sumExamples
 */
public function testSum($a, $b, $expected_result)
{
    $instance = new Sum(1, 2);
    $this->assertEquals($expected_result, $sum->getValue());
}

PHPUnit docs on this

当然,只有当所有数据集的断言相同时,此技术才有用。

最后,如果构造函数参数对于对象起作用是必需的,我会将它们保留在原来的位置。摆脱它们只是为了你可以在setUp实例化对象是不正确的IMO。

答案 1 :(得分:0)

  

我的各种测试取决于传递给的参数   类。

如果测试依赖于构造函数参数,则不能使用setUp来创建实例...安装是为了重复的事情...尽可能避免构造函数注入,所以你可以使用这样的东西:

protected $instance;
public function setUp(){
    $this->instance = new MyClass();
}

public function testSomething(){
    $this->instance->setParams(1,2,3);
    //...
    $this->assertEquals(...);
}

public function testSomethingElse(){
    $this->instance->setFirstParam(1);
    $this->instance->setSecondParam(2);
    $this->instance->setThirdParam(3);
    //...
    $this->assertEquals(...);
}

OFC。这取决于你班级的作用......

答案 2 :(得分:0)

两种方法setUptearDown大多是按惯例进行的。如果需要,你可以使用它们,但你不能使用它们。

E.g。你有一个私人帮助方法可以帮助你创建被测对象的实例,这是完全没问题的。您也可以使用setUp为这些创建工厂。做什么可以帮助你保持测试代码的简单和简单。

由于您尚未共享任何测试代码,因此我无法提供更具体的建议。

继续阅读:xUnit (Wikipedia)Implicit Setup (xUnit Pattern)