【问题标题】:Is it necessary to unit test ActiveRecord validations?是否有必要对 ActiveRecord 验证进行单元测试?
【发布时间】:2009-02-12 11:16:09
【问题描述】:

是否有必要对 ActiveRecord 验证进行单元测试,或者它们已经经过充分测试并因此足够可靠?

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing activerecord


    【解决方案1】:

    验证本身应该是可信的,但您可能需要检查验证是否存在。

    换句话说,测试某事物的好方法是把它当作一个黑盒子,从实现中抽象出测试,例如,您可能有一个测试来检查一个人模型如果没有就无法保存一个名称,但不关心 Person 类如何执行该验证。

    【讨论】:

      【解决方案2】:

      接受开发人员对诸如 ActiveRecord 之类的库的测试比您对它们进行更好的测试就足够了:对他们来说,这是首要关注的问题,而对您来说,这充其量只是切题。

      这并不是说不会有错误 - 我很久以前曾在 MS SQL Server 适配器上发现过一个小错误 - 但您可能正在实施的那种测试极不可能暴露它们,因为它们'最有可能是边缘情况。如果你确实发现了一个错误,当然,如果你用一个暴露它的测试用例报告它可能会很有帮助!

      如果我想更好地理解库实现的特定方面,我只会测试 ActiveRecord 内部。我不会在任何应用程序项目中包含这些探索性测试,因为它们与项目并不真正相关。

      一般来说,您应该为自己编写的代码编写测试:如果您生活或尝试生活在 TDD 世界中,则应该先编写测试。如果您的模型具有验证规则,那么您几乎肯定应该编写测试以确保存在规则。在大多数情况下,测试将是微不足道的,但如果将来某个时间不经意地删除了一行,它们将非常有用......

      【讨论】:

        【解决方案3】:

        正如 Mike 所写,至少您应该测试验证是否存在。这只是一些很容易做到的复式记账(健全性检查)。

        根据情况,您还应该测试您的模型在特定情况下是有效还是无效。例如,如果您的字段需要某种格式,则测试有效的示例格式和无效的示例格式。通过阅读测试中的一些示例,可以更轻松地了解这意味着什么:

        class Person < ActiveRecord::Base
          validates_format_of :email,
              :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
        end
        

        是的,验证经过充分测试且足够可靠。但是您要验证的是您对验证的正确使用。

        【讨论】:

          【解决方案4】:

          作为旁注,Ryan Bigg 的博文has_and_belongs_to_many double insert 提到有人在 ActiveRecord 中遇到错误(但与验证无关)。正如他所指出的,不要假设 Rails 不可能有错误,因为我们知道 Rails 有 900 张未结票。

          但是,是的,您编写测试的主要原因是检查您对 ActiveRecord 的使用是否正确。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-18
            • 2016-08-24
            • 1970-01-01
            • 1970-01-01
            • 2014-01-15
            • 1970-01-01
            • 1970-01-01
            • 2013-05-02
            相关资源
            最近更新 更多