Gar*_*eth 9 activerecord unit-testing ruby-on-rails stubbing
ActiveRecord::Base有一个很大的API'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对象时 - 例如在控制器单元测试中 - 似乎你必须提交上述方法之一,实际上就方法的业务逻辑而言,它不应该是重要的你选择哪个.
你是否必须将你的方法的行为与它的实现紧密结合在一起,还是我错过了一些简单的东西?
一种方法是以这样的方式构建您的类:将任何ActiveRecord::Base方法调用包装在您自己的方法中。
所以不要Foo.new(\xe2\x80\xa6)直接打电话...
class Foo < ActiveRecord::Base\n def self.create_object(\xe2\x80\xa6)\n new(\xe2\x80\xa6)\n end\nend\nRun Code Online (Sandbox Code Playgroud)\n\n这样,在您的测试中您可以存根您自己的方法而不是 ActiveRecord 的方法。
\n\nAvdi Grimm 在“Objects On Rails”一书中详细概述了这种方法(包括其优点)... http://objectsonrails.com
\n