私はたくさん検索しましたが、基本的なように見えますが、これを理解することはできません。これが私がやりたいことの簡単な例です。
次のように、何かを実行しても何も返さない単純なメソッドを作成します。
class Test
def test_method(param)
puts param
end
test_method("hello")
end
しかし、私のrspecテストでは、「hello」の代わりに「goodbye」などの別のパラメーターを渡す必要があります。私はこれがスタブとモックに関係していることを知っています、そして私はドキュメントを見ましたがそれを理解することができません: https://relishapp.com/rspec/rspec-mocks/v/3-0/docs/method-stubs
私が行った場合:
@test = Test.new
allow(@test).to_receive(:test_method).with("goodbye")
デフォルト値をスタブ化するように指示されますが、正しく行う方法がわかりません。
エラーメッセージ:
received :test_method with unexpected arguments
expected: ("hello")
got: ("goodbye")
Please stub a default value first if message might be received with other args as well.
私はrspec3.0を使用していて、次のようなものを呼び出しています
@test.stub(:test_method)
許可されていません。
たとえば、test_method
の実際の結果をテストする必要はないので、puts
が呼び出されてparam
を渡すだけなので、設定してテストします。期待とメソッドの実行:
class Test
def test_method(param)
puts param
end
end
describe Test do
let(:test) { Test.new }
it 'says hello via expectation' do
expect(test).to receive(:puts).with('hello')
test.test_method('hello')
end
it 'says goodbye via expectation' do
expect(test).to receive(:puts).with('goodbye')
test.test_method('goodbye')
end
end
あなたがやろうとしているように見えるのは、メソッドに test spy を設定することですが、メソッドスタブも1レベル設定していると思いますhigh(test_method
内のputs
の呼び出しではなく、test_method
自体)。 puts
の呼び出しにスタブを配置すると、テストに合格するはずです。
describe Test do
let(:test) { Test.new }
it 'says hello using a test spy' do
allow(test).to receive(:puts).with('hello')
test.test_method('hello')
expect(test).to have_received(:puts).with('hello')
end
it 'says goodbye using a test spy' do
allow(test).to receive(:puts).with('goodbye')
test.test_method('goodbye')
expect(test).to have_received(:puts).with('goodbye')
end
end
で説明されているデフォルト値を設定する方法
and_call_original
は、特定の引数に対してオーバーライドできるデフォルトの応答を構成できます
require 'calculator'
RSpec.describe "and_call_original" do
it "can be overriden for specific arguments using #with" do
allow(Calculator).to receive(:add).and_call_original
allow(Calculator).to receive(:add).with(2, 3).and_return(-5)
expect(Calculator.add(2, 2)).to eq(4)
expect(Calculator.add(2, 3)).to eq(-5)
end
end
私がそれについて知るようになった情報源は https://makandracards.com/makandra/30543-rspec-only-stub-a-method-when-a-particular-argumentで見つけることができます-合格