升级到 RSpec 3 并遵循弃用通知会导致 "undefined method 'allow'"

Upgrading to RSpec 3 and following deprecation notice results in "undefined method 'allow'"

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

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

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

DEPRECATION: Using unstub from rspec-mocks' old :should syntax without explicitly enabling the syntax is deprecated. Use allow(...).to_receive(...).and_call_original or explicitly enable :should instead. Called from /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

但现在我得到:

undefined method allow for #<Cucumber::Rails::World:0x007facbed9f1d0> (NoMethodError)

哇?来吧RSpec,我完全按照你说的做了!

基于一些谷歌搜索,我尝试将 require 'rspec/expectations' 添加到该文件的顶部。它什么也没做。

任何人都可以补充我所缺少的吗?

也许您的 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

事实证明我正在做的事情完全没有必要,这可能就是为什么 allow 没有为 After 上下文定义的原因。

Rspec-模拟存根在每个示例(在 Rspec 中)或场景(在黄瓜中)之后被删除,因此在 After 块中取消存根是多余且无用的。

我要更正的整个 After 块应该直接删除。

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