在ActiveRecord模型/实体中值得测试的是什么?


What is worth testing in an ActiveRecord model/entity?

我刚刚开始进行单元测试,当主题测试模型时,我有点困惑和不知所措。我目前有一些带有setter和getter的ActiveRecord模型。它们中的大多数只是简单地封装数据,其中只有少数带来了一些新的东西,例如getFullName()方法返回firstName和lastName字段的连接。

那么我应该测试什么?我应该测试每个单独的属性赋值还是应该只测试像getFullName()这样的特殊方法?我应该走到什么程度?什么时候应该测试类本身,什么时候应该实际测试数据库插入?关于实体中已经存在的验证,我应该考虑到这一点吗?

让我不知所措的是,对于一个有很多字段的实体,我似乎需要进行大量的测试。有别的办法吗?

的例子将特别感谢!

编写您需要的测试,以使您对程序正常工作有信心。

有些人会争辩说,如果类没有业务逻辑,就没有必要为它编写测试。根据这种说法,你的简单getter和setter就不需要测试了。你只为代码中有"业务逻辑"的部分编写测试。

然而,争论的另一面是,如果你写代码,你应该为它写一个测试。按照这种说法,您应该为它们编写一个测试。测试最终会变得非常琐碎。您实例化对象,用setter设置一个值,然后断言该值随后用getter返回。您最终会得到很多简单的测试,编写起来可能会很乏味。

我属于第二个阵营,并且发现如果某些东西很难测试或成为测试的痛苦,这表明我的设计有问题。在这种情况下,您可能拥有不需要的东西的访问器方法。可能发生的情况是,你在数据对象中拥有所有属性,并且"需要"为每个属性设置getter和setter。但你真的吗?

在你的问题中,你提到你有一个getFullName方法。所以你真的需要getFirstNamegetLastName的方法吗?为什么对象中的数据会在页面呈现期间发生变化?为什么不放弃setter并使数据记录"不可变",以便通过发送新对象到数据库进行更新/创建来完成更新?

我敢打赌,你有这个问题的原因是你写了这段代码,现在正试图回去为它写测试。有了这个数据对象,就自动为所有东西创建了getter和setter。然后编写使用它时所需的额外方法(如getFullName方法)。相反,我建议您只在需要时创建访问器。然后创建测试,您将发现函数列表实际上更小了。你可能有一些方法来获得你需要的数据组合,以及一个批量方法来获得特定形式的所有数据(如json)。