【发布时间】:2016-01-07 18:52:39
【问题描述】:
我有以下测试方法来测试构造函数是否正常工作:
选项#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 来公开测试这些方法。
你会使用哪个选项?
【问题讨论】:
-
除了选项,也许只有我一个人,我会通过参数传递
Foo的实例 -
@Andrew,我正在测试 Foo 方法,而不是使用它作为参数。
-
除非你的 setter 做一些不寻常的事情,否则单元测试 getter 和 setter 没有多大意义
-
我使用反射来验证构造函数是否正确保存了内部值。这主要用于测试真正需要以特定方式设置这些值的特定功能。正如上面的@RobbieAverill 所示,您不必总是测试这些。在我们的代码中,继承和其他因素意味着某些字段需要特定的数据,这就是使用反射的原因,以便我们可以验证保存的数据,作为跨不同应用程序测试共享库代码的一部分。
标签: php unit-testing testing phpunit