升级到 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.rb
或 spec/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)
升级 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. Useallow(...).to_receive(...).and_call_original
or explicitly enable:should
instead. Called from /Users/grant/xx/features/support/hooks.rb:37:inblock 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.rb
或 spec/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)