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

オリジナルの実装をラップする

and_wrap_original を使用して、部分的なダブルのオリジナルの応答を変更します。これは、外部オブジェクトを利用するが、その応答を変更したい場合に便利です。たとえば、APIが大量のデータを返し、テスト目的でそれを縮小したい場合に使用できます。また、with を使用して、ほとんどの引数に対するデフォルトの応答を設定し、それを特定の引数に対してオーバーライドすることもできます。

注意: and_wrap_original は部分的なダブルのみサポートされており、通常のテストダブルにはオリジナルの実装がありません。

背景

次の内容で "lib/api.rb" という名前のファイルがあるとします:

class API
def self.solve_for(x)
(1..x).to_a
end
end

and_wrap_original はオリジナルの部分的なダブルの応答をラップします

次の内容で "spec/and_wrap_original_spec.rb" という名前のファイルがあるとします:

require 'api'

RSpec.describe "and_wrap_original" do
it "responds as it normally would, modified by the block" do
expect(API).to receive(:solve_for).and_wrap_original { |m, *args| m.call(*args).first(5) }
expect(API.solve_for(100)).to eq [1,2,3,4,5]
end
end

rspec spec/and_wrap_original_spec.rb を実行すると

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

and_wrap_original は特定の引数に対してオーバーライドできるデフォルトの応答を設定できます

次の内容で "spec/and_wrap_original_spec.rb" という名前のファイルがあるとします:

require 'api'

RSpec.describe "and_wrap_original" do
it "can be overridden for specific arguments using #with" do
allow(API).to receive(:solve_for).and_wrap_original { |m, *args| m.call(*args).first(5) }
allow(API).to receive(:solve_for).with(2).and_return([3])

expect(API.solve_for(20)).to eq [1,2,3,4,5]
expect(API.solve_for(2)).to eq [3]
end
end

rspec spec/and_wrap_original_spec.rb を実行すると

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

and_wrap_original は特定のキーワード引数に対してオーバーライドできるデフォルトの応答を設定できます

次の内容で "lib/kw_api.rb" という名前のファイルがあるとします:

class API
def self.solve_for(x: 1, y: 2)
(x..y).to_a
end
end

次の内容で "spec/and_wrap_original_spec.rb" という名前のファイルがあるとします:

require 'kw_api'

RSpec.describe "and_wrap_original" do
it "can be overridden for specific arguments using #with" do
allow(API).to receive(:solve_for).and_wrap_original { |m, **kwargs| m.call(**kwargs).first(5) }
allow(API).to receive(:solve_for).with(x: 3, y: 4).and_return([3])

expect(API.solve_for(x: 1, y: 20)).to eq [1,2,3,4,5]
expect(API.solve_for(y: 20)).to eq [1,2,3,4,5]
expect(API.solve_for(x: 3, y: 4)).to eq [3]
end
end

rspec spec/and_wrap_original_spec.rb を実行すると

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