web-dev-qa-db-ja.com

Rspec 3.0パラメータを置き換えるが戻り値のないメソッドをモックする方法は?

私はたくさん検索しましたが、基本的なように見えますが、これを理解することはできません。これが私がやりたいことの簡単な例です。

次のように、何かを実行しても何も返さない単純なメソッドを作成します。

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)

許可されていません。

14
user3060126

たとえば、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レベル設定していると思いますhightest_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
1
Paul Fioravanti

で説明されているデフォルト値を設定する方法

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で見つけることができます-合格

19
Jignesh Gohel