9

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

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

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

  • foo.create或者foo.create!
  • foo.save或者foo.save!
  • foo.update_attributes或者foo.update_attributes!

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

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

4

1 回答 1

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

于 2012-03-15T13:39:48.443 回答