是否有必要对ActiveRecord验证进行单元测试?

时间:2009-02-12 11:16:09

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

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

4 个答案:

答案 0 :(得分:15)

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

换句话说,测试某些东西的好方法就好像它是一个黑盒子,从实现中抽象出测试,所以例如你可能有一个测试来检查一个人模型是否无法保存一个名称,但不关心Person类如何执行该验证。

答案 1 :(得分:4)

接受像ActiveRecord这样的库比开发人员更好地测试它们应该足够了:对于它们来说,这是一个主要关注点,对你来说它至关重要。

这并不是说不会有错误 - 很久以前我发现了一个很小的MS SQL Server适配器 - 但是你可能会实现的那种测试很可能不会暴露它们最有可能是边缘案件。如果您发现了一个错误,当然,如果您使用暴露它的测试用例进行报告,它可能会非常有用!

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

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

答案 2 :(得分:3)

正如Mike所写,至少你应该测试验证是否存在。这只是一个双重会计(完整性检查),这很容易做到。

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

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

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

答案 3 :(得分:0)

作为旁注,Ryan Bigg的博客文章has_and_belongs_to_many double insert提到有人遇到ActiveRecord中的错误(尽管不是验证相关)。正如他所指出的,不要认为Rails不可能有bug,因为我们知道Rails有900张门票。

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