メインコンテンツまでスキップ

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/stub_chain_spec.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/stub_chain_spec.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を実行すると、

すべての例がパスするはずです。