Unit testing 单元测试-当我的实例化发生变化时,我是否可以/应该使用setUp和tearDown?

Unit testing 单元测试-当我的实例化发生变化时,我是否可以/应该使用setUp和tearDown?,unit-testing,tdd,phpunit,Unit Testing,Tdd,Phpunit,假设我有一个在构造函数中使用参数的类,例如: $var = new MyClass(1, 2, 3); 我的各种测试取决于传递给类的参数 我注意到PHPUnit有setUp()和tearDown()方法,它们可以用来实例化一个类,通常是在构造函数没有参数的情况下,在执行每个测试之前 有没有一种方法可以在我的测试工具中使用setUp和tearDown方法来处理我的示例中的此类类,或者我只是在每次测试中单独设置类,就像我一直在做的那样 我问这个问题更多是为了确认我没有遗漏任何关于如何正确使用设置和

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

$var = new MyClass(1, 2, 3);
我的各种测试取决于传递给类的参数

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

有没有一种方法可以在我的测试工具中使用
setUp
tearDown
方法来处理我的示例中的此类类,或者我只是在每次测试中单独设置类,就像我一直在做的那样

我问这个问题更多是为了确认我没有遗漏任何关于如何正确使用
设置
拆卸
的内容

我的各种测试取决于传递给 班级

如果测试取决于构造函数参数,则无法使用安装程序创建实例。。。设置是为了重复的事情。。。如果可能的话,尽量避免构造函数注入,这样您就可以使用如下方法:

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。这取决于你的类做什么…

我同意inf3rno的回答:如果构造函数需要参数,你不应该使用setUp

也许你可以利用另一个特性:数据提供者。它们允许您为同一测试定义多个数据集:

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());
}

当然,只有当所有数据集的断言都相同时,这种技术才有用


最后,如果构造函数参数是对象工作所必需的,我会将它们保留在原来的位置。在我看来,仅仅为了在安装时实例化对象而去掉它们是不正确的。

这两种方法
setUp
tearDown
大多是按惯例使用的。如果你需要,你可以利用它们,但你不能

例如,如果你有一个私人助手方法来帮助你创建被测试对象的实例,那就太好了。您还可以使用
setUp
为这些设置创建工厂。做些有助于保持测试代码小而简单的事情

由于您没有共享任何测试代码,我无法给出更具体的建议


继续阅读:和。

谢谢。。。这让我走上了。。我是想避免构造函数注入还是想使用它。这是一个更深层次的话题。我考虑了一段时间,我想避免设置程序没有被正确调用的情况,所以我将参数放入构造函数中。是的,数据集也很好;-)