重新提出问题
原来的问题似乎并不清楚。让我重试。
在RSpec控制器测试中,如何存根不能直接访问的对象的方法?具体做法是:
# foo_controller
def show
@object = Foo.find(params[:id])
@action = current_user.actions.create(foo: @object, ... ) # log view action
# ...
end
# action.rb model
belongs_to :user
belongs_to :object # actually polymorphic, but not for this example
before_validation :cache_values
def cache_values
if self.foo # safety check
# cache some attributes in action since Foo instances might get deleted
self.attribute1 = self.foo.attribute1
self.attribute2 = self.foo.attribute2
# ...
end
end
在控制器测试中,我想要存根Foo
,因为它的创建成本很高。在Rails 3和rspec 2.14中,我能够做到
expect(Foo).to receive(:find).with("123") { mock_model(Foo) }
将在Foo
方法中访问模拟的cache_values
实例。但是,这不再适用于Rails 3.2和rspec 3.1。如果action
也是模拟我可以使用
expect(@mock_action).to receive(:foo) { mock_model(Foo) }
我意识到这可能是控制器测试的最佳方式,但是我想了解如何在最低级别“捕获”ActiveModel关联数据库查找。