【发布时间】:2015-01-03 21:58:24
【问题描述】:
改写的问题
似乎最初的问题并不清楚。让我重试。
在 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 关联数据库查找。
【问题讨论】:
-
您是否按照升级指南进行操作? rspec.github.io/upgrading-from-rspec-2 如果 RSpec 3 中有任何新的故障不在 RSpec 2 中,并且升级过程没有给你一个弃用警告,那么我们认为这是一个错误,我们会要求你将它报告给 github .
-
我安装了 transpec 并重新格式化了大部分语法更改,但我不知道 rspec 2.99。我的主要抱怨是(显然)我不能再使用上面的
expect(Foo).to receive(:find)...语法来模拟 AR 关联。或者我做错了什么。 -
请打开一个问题——该语法应该适用于任何类型的对象。
-
在我这样做之前 - 访问
has_manytype 子对象的 ActiveModel 内部语法是否可能在 3.0 和 3.2 之间发生变化,因此这种语法对 Rails 不再适用?我如何/在哪里可以检查这个? -
不知道,我已经好几年没用 Rails了。
标签: ruby-on-rails ruby ruby-on-rails-3 rspec rspec3