Rails 3.2.21& Rspec 3升级和许多期望失败 - 为什么?

时间:2015-01-03 21:58:24

标签: ruby-on-rails ruby ruby-on-rails-3 rspec rspec3

重新提出问题

原来的问题似乎并不清楚。让我重试。

在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关联数据库查找。

1 个答案:

答案 0 :(得分:1)

Rspec 3不支持mock_model方法;它已被提取到一个单独的gem rspec-activemodel-mocks

参考:http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#extracted_activemodel_mocks_support

包含此gem应修复失败的测试。