我有以下测试方法来测试构造函数是否正常工作:
选项#1
public function testConstructWorksProperly()
{
$id = 1;
$name = 'name';
$foo = new Foo($id, $name);
$this->assertEquals($id, $foo->getId());
$this->assertEquals($name, $foo->getNome());
}
选项#2
public function testConstructWorksProperly()
{
$id = 1;
$name = 'name';
$foo = new Foo($id, $name);
$this->assertAttributeEquals($id, 'id', $foo);
$this->assertAttributeEquals($name, 'name', $foo);
}
在选项 #1 中,我需要创建 getter 来断言构造函数正常工作,而在选项 #2 中,我使用一个断言来检查构造函数是否正确设置了属性。
我想知道每次我需要公开访问这些属性时总是使用选项 #1,因为我节省了时间和 LOC,而不是为 getId
和 getName 编写另外 2 个测试
。
使用选项二似乎是白盒测试。 但是……
俗话说:“每次测试一个断言”,因此,如果我的构造函数有 6 个参数,我将需要 6 个断言和 6 个 getter 来公开测试这些方法。
您会使用哪个选项?
最佳答案
在做任何事情之前,您必须问自己:测试构造函数的目的是什么?您这样做的真正目的是什么?
如果您想要在单独的测试中隔离每个方法,您应该使用选项#2(选项#1 也称为您的 getter),但我真的认为,在“现实生活”中项目,没有测试构造函数的值(value)。
构造函数只是告诉应该如何构建对象,你不应该在它上面有太多逻辑,你所有的测试都依赖于构造函数,所以如果它不工作,你的测试就会失败。
如果您在构造函数上有逻辑,您可以使用命名构造函数来简化事情(并且是测试它们)。
P.S.1:不要忘记访问器并不是那么好,在添加它们(尤其是 setter)之前,您真的应该慎重考虑。我们应该始终关注对象的行为,而不是对象的状态。
P.S.2:选项#2 应该是这样的:
public function testConstructWorksProperly()
{
$id = 1;
$name = 'name';
$foo = new Foo($id, $name);
$this->assertAttributeEquals($id, 'id', $foo);
$this->assertAttributeEquals($name, 'name', $foo);
}
关于php - 单元测试构造函数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662955/