【问题标题】:What is worth testing in an ActiveRecord model/entity?在 ActiveRecord 模型/实体中什么值得测试?
【发布时间】:2015-10-14 19:06:12
【问题描述】:

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

那么我应该测试什么?我应该测试每一个属性分配还是只测试 getFullName() 之类的特殊方法?我应该去到什么程度?我什么时候应该测试类本身,什么时候应该实际测试数据库插入?那么实体中已经存在的验证呢,我应该考虑到这一点吗?

令我不知所措的是,对于一个包含大量字段的实体,我似乎需要进行大量测试。有办法解决吗?

示例将不胜感激!

【问题讨论】:

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


    【解决方案1】:

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

    有些人会争辩说,如果类没有业务逻辑,就没有必要为它编写测试。根据这个论点,那么您的简单 getter 和 setter 就不需要测试了。您只为具有“业务逻辑”的代码部分编写测试。

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

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

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

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

    【讨论】:

    • 我正在开始一个新项目,我想正确地开始它。我正在使用带有为我生成类的工具的 ORM。我可以有或没有访问器。我只是认为每个属性都有访问器而不是只有一些访问器更加统一。在应用程序的某些部分我可能想使用名字,在其他部分我可能想使用全名。 getFullName 是自定义业务逻辑的一个示例。我将有其他方法可以进行自定义查询,对我来说测试这些方法当然是有意义的。我只是不确定简单的 getter 和 setter。
    • 我的观点是,如果您编写代码,应该值得为其编写测试。我还试图指出,您不一定需要每个属性的访问器,创建所有这些方法是额外的工作。您对编写测试的恐惧正在向您指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多