【问题标题】:Rails 3.2.21 & Rspec 3 upgrade and a lot of expectations fail - why?Rails 3.2.21 & Rspec 3 升级和很多期望都失败了——为什么?
【发布时间】: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


【解决方案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 应该可以修复失败的测试。

【讨论】:

  • 是的,我有这个宝石(抱歉,忘了提,更新了我上面的文字)。该错误与mock_model无关,问题是我的期望/允许没有“捕获”数据库查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2010-12-05
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
相关资源
最近更新 更多