单元测试构造函数的最佳方法是什么?

时间:2016-01-07 18:52:40

标签: php unit-testing testing phpunit

我有以下测试方法来测试构造函数是否正常工作:

选项#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而不是为getIdgetName编写另外两个测试。< / p>

使用选项二似乎是一个白盒测试。的但是...

有一种说法:“每次测试一个断言”,所以,如果我的构造函数有6个参数,那么我将需要6个断言和6个getter来公开测试这些方法。

您将使用哪个选项?

1 个答案:

答案 0 :(得分:3)

在此之前你必须问自己:测试构造函数的目的是什么?你真的想通过这样做来实现什么目标?

如果您想要的是在分离测试中隔离每个方法,您应该使用选项#2 (选项#1也可以调用您的getter)但我真的认为,在&#34;现实生活&#34;项目,测试构造函数没有价值。

构造函数只是告诉对象应该如何构建,你不应该有太多的逻辑,所有的测试都取决于构造函数,所以如果它没有工作,你的测试就会失败。 / p>

如果构造函数上有逻辑,则可以使用命名构造函数使事情更简单(并测试它们)。

P.S.1:不要忘记访问者不是那么好,在添加它们之前你应该明智地思考(特别是设置者)。我们应该始终关注行为,而不是对象的状态。

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