升级到RSpec 3并遵循弃用通知会导致“未定义方法'允许'”

时间:2015-07-25 02:50:13

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

在升级RSpec之前,我在我的features / support / hooks.rb文件中有这个块:

After do
  begin
    Challenge.unstub(:current)
  rescue RSpec::Mocks::MockExpectationError
  end
end

升级后,我收到了这个通知:

  

弃用:不使用rspec-mocks的旧unstub语法中的:should而不显式启用语法。使用allow(...).to_receive(...).and_call_original或明确启用:should。来自/Users/grant/xx/features/support/hooks.rb:37:in block in <top (required)>

好的,听起来很简单。我把我的代码更改为:

After do
  begin
    allow(Challenge).to receive(:current).and_call_original
  rescue RSpec::Mocks::MockExpectationError
  end
end

但现在我得到了:

  

allow

的未定义方法#<Cucumber::Rails::World:0x007facbed9f1d0> (NoMethodError)

笏?来吧RSpec,我完全按照你的要求做了!

基于一些谷歌搜索,我尝试将require 'rspec/expectations'添加到此文件的顶部。它没有做任何事情。

任何人都可以告诉我我缺少的东西吗?

2 个答案:

答案 0 :(得分:1)

也许您的RSpec配置无法启用allow语法。在您的RSpec配置文件中,可能是spec/spec_helper.rbspec/rails_helper.rb,您是否有以下内容?

RSpec.configure do |config|
  config.mock_with :rspec do |c|
    c.syntax = :should
  end
end

如果是,请查看是否将其更改为

RSpec.configure do |config|
  config.mock_with :rspec do |c|
    c.syntax = [:should, :expect]
  end
end

解决了您的问题。然后将should的所有用法替换为allow的使用,并升级:should语法的其他用法,可能使用transpec,并禁用:should语法,你就是最新的。

来源:https://relishapp.com/rspec/rspec-expectations/docs/syntax-configuration

答案 1 :(得分:1)

事实证明,我所做的事情完全是不必要的,这可能是为allow上下文定义After的原因。

在每个示例(在Rspec中)或场景(在黄瓜中)之后删除Rspec-mock存根,因此在After块中取消它们是多余的,没用。

我想要纠正的整个After块应该只是被删除。

Special thanks to this post by Myron Marston on the Rspec Google Group