如何避免RSpec 3.0中stub_chain的弃用警告?

时间:2013-11-28 22:16:46

标签: ruby-on-rails rspec

当我使用stub_chain运行测试时,我会收到弃用警告。

describe "stubbing a chain of methods" do
  subject { Object.new }

  context "given symbols representing methods" do
    it "returns the correct value" do
      subject.stub_chain(:one, :two, :three).and_return(:four)
      expect(subject.one.two.three).to eq(:four)
    end
  end
end

弃用警告: 在不明确启用语法的情况下,使用rspec-mocks的旧stub_chain语法中的:should已弃用。使用新的:expect语法或明确启用:should

如何避免这种警告?

4 个答案:

答案 0 :(得分:68)

<击> 为了按原样删除代码警告,您必须在配置中明确启用should语法:

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

<击>

stub_chain的替换语法是:

allow(object).to receive_message_chain(:one, :two, :three).and_return(:four)
expect(object.one.two.three).to eq(:four)

有关此内容及其用法的更多信息:

在撰写本文时,receive_message_chain的更改将包含在rspec-mocks的3.0.0.beta2版本中(请参阅Changelog)。如果您现在 ,您必须生活在最前沿并在Gemfile中添加特定的提交引用以使receive_message_chain正常工作:

gem 'rspec-mocks', github: 'rspec/rspec-mocks', ref: '4662eb0'

不幸的是,这实际上并没有回答你关于摆脱折旧信息的问题,我无法做到这一点,即使是发布版本的rspec-mocks和
c.syntax = [:should, :expect]在我的RSpec配置中明确设置。

<击> 所以,我想说你的选择是要等到3.0.0.beta2发布,看看当时是否修改了现有代码的弃用通知,或者引入最新的更改并将语法更改为{{1 }}。

请参阅Myron's answer了解实际解决方案。

答案 1 :(得分:32)

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

请注意,正如Paul的回答所示,它正在设置rspec-mocks语法,而不是rspec-expectations语法。

答案 2 :(得分:3)

这是一个对我有用的解决方案 - 我使用的是Rails 4.1.7:

在spec / spec_helpber.rb中,设置rspec-expectations'和/或rspec-mocks'语法如下:

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

希望这有助于其他人:)

答案 3 :(得分:0)

对于任何想要将旧项目升级为新语法的人,都有一个工具here

Relish blog中所述,他们可能会在未来将should语法移动到外部gem中,这让我相信它最终会被淘汰。