stub_chain

stub_chain允许消息链 的旧方法,但它带有对所有对象的全局猴子补丁的包袱。与 receive_message_chain 一样,请谨慎使用;我们建议将 stub_chain 的使用视为代码异味。

背景

给定一个名为 “spec/spec_helper.rb” 的文件,其中包含

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

以及一个名为 “.rspec” 的文件,其中包含

--require spec_helper

在替身上使用 stub_chain

给定一个名为 “spec/stubchainspec.rb” 的文件,其中包含

RSpec.describe "Using stub_chain on a double" do
  let(:dbl) { double }

  example "using a string and a block" do
    dbl.stub_chain("foo.bar") { :baz }
    expect(dbl.foo.bar).to eq(:baz)
  end

  example "using symbols and a hash" do
    dbl.stub_chain(:foo, :bar => :baz)
    expect(dbl.foo.bar).to eq(:baz)
  end

  example "using symbols and a block" do
    dbl.stub_chain(:foo, :bar) { :baz }
    expect(dbl.foo.bar).to eq(:baz)
  end
end

我运行 rspec spec/stub_chain_spec.rb

所有示例都应该通过。

在类的任何实例上使用 stub_chain

给定一个名为 “spec/stubchainspec.rb” 的文件,其中包含

RSpec.describe "Using any_instance.stub_chain" do
  example "using a string and a block" do
    Object.any_instance.stub_chain("foo.bar") { :baz }
    expect(Object.new.foo.bar).to eq(:baz)
  end

  example "using symbols and a hash" do
    Object.any_instance.stub_chain(:foo, :bar => :baz)
    expect(Object.new.foo.bar).to eq(:baz)
  end

  example "using symbols and a block" do
    Object.any_instance.stub_chain(:foo, :bar) { :baz }
    expect(Object.new.foo.bar).to eq(:baz)
  end
end

我运行 rspec spec/stub_chain_spec.rb

所有示例都应该通过。