如何在不假设它如何使用的情况下存根ActiveRecord :: Base方法?

时间:2012-03-15 11:32:41

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

ActiveRecord::Base有一个很棒的API,它有多种查找和保存对象的方法。例如,您的AR::B对象可能已经从多种方法实例化:

  • Foo.new(…)
  • Foo.create(…)
  • Foo.find(…)
  • Foo.find_by_sql(…)
  • Foo.find_[all_]by_*(…)
  • bar.foos(协会)
    • ...和关于关联的查找器方法

同样,有问题的对象可能会通过几种不同的方法保持不变:

  • foo.createfoo.create!
  • foo.savefoo.save!
  • foo.update_attributesfoo.update_attributes!

现在,在编写单元测试时,最好将存根外部方法调用存根,以便您的测试可以专注于相关方法的业务逻辑。但是,当涉及使用AR::B对象时 - 例如在控制器单元测试中 - 看起来你必须提交上述方法之一,实际上就方法的业务逻辑而言你选择的不应该很重要。

你是否必须将你的方法的行为与它的实现紧密结合在一起,还是我错过了一些简单的东西?

1 个答案:

答案 0 :(得分:3)

一种方法是以这样的方式构建您的类,以便在您自己的方法中包装任何ActiveRecord::Base方法调用。

所以不要直接调用Foo.new(…) ......

class Foo < ActiveRecord::Base
  def self.create_object(…)
    new(…)
  end
end

在测试中,您可以使用自己的方法而不是ActiveRecord来实现。

Avdi Grimm在“Objects On Rails”一书中详细介绍了这种方法(包括其优点)...... http://objectsonrails.com