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!
现在,在编写单元测试时,最好对外部方法调用进行 stub ,以便您的测试可以专注于所讨论方法的业务逻辑。但是,当涉及到
AR::B
对象时(例如在 Controller 单元测试中),似乎您必须致力于上述方法之一,而实际上就该方法的业务逻辑而言,则不应该您选择的重要。您是否必须将方法的行为与此实现紧密结合,还是我错过了一些简单的方法?
最佳答案
一种方法是以这样的方式构建类:将所有ActiveRecord::Base
方法调用包装在自己的方法中。
因此,与其直接调用Foo.new(…)
,不如...
class Foo < ActiveRecord::Base
def self.create_object(…)
new(…)
end
end
这样,在测试中,您可以 stub 自己的方法,而不是ActiveRecord的方法。
Avdi Grimm在“Objects On Rails”一书中详细概述了这种方法(包括其好处)... http://objectsonrails.com
关于ruby-on-rails - 您如何在不对ActiveRecord::Base方法进行使用做任何假设的情况下对它们进行 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9718822/