Ruby on Rails:我的所有ActiveRecord回调方法都应该是私有的吗?

时间:2012-06-11 14:36:38

标签: ruby-on-rails activerecord rspec

我有一个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

换句话说:

  1. 如果我想测试“before_validation”方法,我是否必须将其公开并直接在我的模型Rspec文件中调用test_object.before_validation?
  2. 如果我不仅要测试,那个自定义验证方法是唯一的?()在验证时被调用,而且,方法本身,我是否也必须公开唯一的?()?
  3. 问题是,我在模型之外使用的这些方法都没有(因此它们应该是私有的),但是如何在不公开的情况下进行测试?

1 个答案:

答案 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?方法也是如此。给它一些输入并测试行为,而不必关心使用哪种特定方法或任何其他实现细节。