【发布时间】:2009-02-12 11:16:09
【问题描述】:
是否有必要对 ActiveRecord 验证进行单元测试,或者它们已经经过充分测试并因此足够可靠?
【问题讨论】:
标签: ruby-on-rails ruby unit-testing activerecord
是否有必要对 ActiveRecord 验证进行单元测试,或者它们已经经过充分测试并因此足够可靠?
【问题讨论】:
标签: ruby-on-rails ruby unit-testing activerecord
验证本身应该是可信的,但您可能需要检查验证是否存在。
换句话说,测试某事物的好方法是把它当作一个黑盒子,从实现中抽象出测试,例如,您可能有一个测试来检查一个人模型如果没有就无法保存一个名称,但不关心 Person 类如何执行该验证。
【讨论】:
接受开发人员对诸如 ActiveRecord 之类的库的测试比您对它们进行更好的测试就足够了:对他们来说,这是首要关注的问题,而对您来说,这充其量只是切题。
这并不是说不会有错误 - 我很久以前曾在 MS SQL Server 适配器上发现过一个小错误 - 但您可能正在实施的那种测试极不可能暴露它们,因为它们'最有可能是边缘情况。如果你确实发现了一个错误,当然,如果你用一个暴露它的测试用例报告它可能会很有帮助!
如果我想更好地理解库实现的特定方面,我只会测试 ActiveRecord 内部。我不会在任何应用程序项目中包含这些探索性测试,因为它们与项目并不真正相关。
一般来说,您应该为自己编写的代码编写测试:如果您生活或尝试生活在 TDD 世界中,则应该先编写测试。如果您的模型具有验证规则,那么您几乎肯定应该编写测试以确保存在规则。在大多数情况下,测试将是微不足道的,但如果将来某个时间不经意地删除了一行,它们将非常有用......
【讨论】:
正如 Mike 所写,至少您应该测试验证是否存在。这只是一些很容易做到的复式记账(健全性检查)。
根据情况,您还应该测试您的模型在特定情况下是有效还是无效。例如,如果您的字段需要某种格式,则测试有效的示例格式和无效的示例格式。通过阅读测试中的一些示例,可以更轻松地了解这意味着什么:
class Person < ActiveRecord::Base
validates_format_of :email,
:with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
end
是的,验证经过充分测试且足够可靠。但是您要验证的是您对验证的正确使用。
【讨论】:
作为旁注,Ryan Bigg 的博文has_and_belongs_to_many double insert 提到有人在 ActiveRecord 中遇到错误(但与验证无关)。正如他所指出的,不要假设 Rails 不可能有错误,因为我们知道 Rails 有 900 张未结票。
但是,是的,您编写测试的主要原因是检查您对 ActiveRecord 的使用是否正确。
【讨论】: