我有一个ActiveRecord模型,它有一些我想测试的回调和自定义验证。这意味着,我必须将所有这些公开。这是一个好的做法还是在这种情况下有更好的解决方案?
我想测试的方法示例:
def before_validation
original.edit(self) if original
end
validate :unique?, on: :create
def unique?
return true if original.blank?
errors.add(:base, 'The entry already exists')
false
end
换句话说:
问题是,我在模型之外使用的这些方法都没有(因此它们应该是私有的),但是如何在不公开的情况下进行测试?
答案 0 :(得分:3)
很容易陷入测试实施阶段,但这是测试行为的一个很好的选择。
问问自己,你的验证在做什么之前是什么?然后自己做一个测试,在给定某些输入的情况下,当且仅当您的验证工作正常时,您将获得某些输出。
举一个简单的例子,假设你有一个简单的name
属性的用户模型,你有一个before_validation,它只是:
name = "Auto-generated name." if name.blank?
然后你可以这样写一个测试:
it "gets an auto-generated name if none is specified." do
user = User.create!
user.name.should eq "Auto-generated name."
end
it "does not get an auto-generated name if one is specified." do
user = User.create!(:name => "Test Name")
user.name.should eq "Test Name"
end
正如您所看到的,此测试确实测试了验证,但它不需要公开,因为您只是测试它的行为。您的unique?
方法也是如此。给它一些输入并测试行为,而不必关心使用哪种特定方法或任何其他实现细节。