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

标签 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 编写另外 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/

相关文章:

asp.net - 如何从项目中删除 Chutzpah 以不在测试资源管理器中显示结果?

delphi - 从 Delphi 项目中删除单例实例

javascript - Aurelia 注入(inject)模拟依赖

php - 为什么 Chat-Api 中会出现无限循环?

php - 如何从 MySQL 中的另一个表过滤的一个表中选择行?

javascript - 如何使函数返回通过 AJAX 检索的数据

testing - 使用 Selenium,xpath 找不到 'text' 元素

php - 使用 microsoft graph API 创建事件时设置自己的事件 ID

java - 如何在 Spring Boot 中测试对外部 api 的调用

java - 模拟具有通用(?扩展集合)返回类型的方法时遇到问题