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
对象时 - 例如在控制器单元测试中 - 看起来你必须提交上述方法之一,实际上就方法的业务逻辑而言你选择的不应该很重要。
你是否必须将你的方法的行为与它的实现紧密结合在一起,还是我错过了一些简单的东西?
答案 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