オリジナルの実装をラップする
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
を実行すると
すべての例がパスするはずです。