假设我有一个在构造函数中使用参数的类,如下:
$var = new MyClass(1, 2, 3);
我的各种测试取决于传递给类的参数。
我注意到PHPUnit有setUp()和tearDown()方法,在执行每个测试之前,通常在构造函数没有参数时可以用来实例化一个类。
有没有办法在我的测试工具中使用setUp
和tearDown
方法来处理我的示例中的类,或者我只是在每次测试中单独设置我的类,就像我一直在在做什么?
我更多地问这个问题,以确定我没有错过任何关于如何正确使用setUp
和tearDown
的内容。
答案 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());
}
当然,只有当所有数据集的断言相同时,此技术才有用。
最后,如果构造函数参数对于对象起作用是必需的,我会将它们保留在原来的位置。摆脱它们只是为了你可以在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)
两种方法setUp
和tearDown
大多是按惯例进行的。如果需要,你可以使用它们,但你不能使用它们。
E.g。你有一个私人帮助方法可以帮助你创建被测对象的实例,这是完全没问题的。您也可以使用setUp
为这些创建工厂。做什么可以帮助你保持测试代码的简单和简单。
由于您尚未共享任何测试代码,因此我无法提供更具体的建议。