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

时间:2015-10-14 19:06:12

标签: php unit-testing activerecord phpunit database-testing

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

那我应该测试什么?我应该测试每个属性赋值还是应该只测试getFullName()这样的特殊方法?我应该在多大程度上去?我应该何时测试类本身以及何时应该实际测试数据库插入?如果考虑到这一点,实体中已经存在的验证怎么办?

让我感到震惊的是,对于拥有大量字段的实体,我似乎需要进行多少测试。有办法吗?

特别赞赏的例子!

1 个答案:

答案 0 :(得分:0)

编写您需要的测试,以确保您的程序正常运行。

有人会争辩说,如果班级没有业务逻辑,就不需要为它编写测试。根据该论点,您的简单getter和setter不需要进行测试。您只需为具有“业务逻辑”的代码部分编写测试。

然而,论证的另一面是,如果你编写代码,你应该为它编写一个测试。通过这个论点,你应该为它们写一个测试。测试最终会变得非常微不足道。您实例化该对象,使用setter设置一个值,然后断言该值随后将与getter一起返回。您最终会进行大量简单的测试,编写起来会变得乏味。

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

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

我敢打赌,你有这个问题的原因是你编写了这段代码,现在正试图回去为它编写测试。您拥有此数据对象并自动为所有内容创建getter和setter。然后编写您使用它时需要的额外方法(如getFullName方法)。相反,我建议您只在需要时创建访问器。然后你创建测试,你会发现功能列表要小得多。您可能有一些方法可以获得所需的数据组合,也可以使用批量方法获取特定形式的所有数据(即json)。