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

Dan*_*ima 4 php testing phpunit unit-testing

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

选项1

public function testConstructWorksProperly()
{
    $id = 1;
    $name = 'name';
    $foo = new Foo($id, $name);
    $this->assertEquals($id, $foo->getId());
    $this->assertEquals($name, $foo->getNome());
}
Run Code Online (Sandbox Code Playgroud)

选项#2

public function testConstructWorksProperly()
{
    $id = 1;
    $name = 'name';
    $foo = new Foo($id, $name);
    $this->assertAttributeEquals($id, 'id', $foo);
    $this->assertAttributeEquals($name, 'name', $foo);
}
Run Code Online (Sandbox Code Playgroud)

在选项 #1 上,我需要创建 getter 来断言构造函数正常工作,而在选项 #2 中,我使用断言来检查构造函数是否正确设置了属性。

我想知道每次我需要公开访问这些属性时总是使用选项 #1,因为我节省了时间和 LOC,而不是为getId和编写另外 2 个测试getName

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

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

你会使用哪个选项?

小智 6

在做任何事情之前,您必须问自己:测试构造函数的目的是什么?你这样做真正想达到什么目的?

如果您想要在单独的测试中隔离每个方法,您应该使用选项 #2(选项 #1 也调用您的 getter),但我真的认为,在“现实生活”项目中,测试构造函数没有任何价值。

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

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


PS1:不要忘记访问器不是那么好,在添加它们之前你应该明智地思考(尤其是setter)。我们应该始终关注行为而不是对象的状态。


PS2:选项#2 应该是这样的:

public function testConstructWorksProperly()
{
    $id = 1;
    $name = 'name';
    $foo = new Foo($id, $name);
    $this->assertAttributeEquals($id, 'id', $foo);
    $this->assertAttributeEquals($name, 'name', $foo);
}
Run Code Online (Sandbox Code Playgroud)