1

私のテストケースは以下の通りです:

    petition1 = Petition.create
    petition2 = Petition.create

    petition1.should_receive(:test_method).with(7).and_return(50.0)
    petition2.should_receive(:test_method).with(7).and_return(25.0)

    petition1.test_method(7) # => 50.0
    Petition.first.test_method(7) # => 0.0

    petition2.test_method(7) # => 25.0
    Petition.last.test_method(7) # => 0.0

データベースから直接取得したレコードのメソッド呼び出しをスタブするにはどうすればよいですか?

単体テストでレコードを反復処理しており、特定の応答を返すために特定のレコードに対するメソッド呼び出しが必要です。

4

1 に答える 1

0

ここでの問題は、(あなたが発見したように)findメソッドを呼び出すとの新しいインスタンスが作成されることですPetition。これを回避するには、findメソッド自体をスタブし、必要なオブジェクトを返すだけです。

let(:petition1) { Petition.create }
let(:petition2) { Petition.create }

it "does what I want" do
  Petition.stub(:first) { petition1 }
  Petition.stub(:last) { petition2 }
  petition1.should_receive(:test_method).with(7).and_return(50.0)
  petition2.should_receive(:test_method).with(7).and_return(25.0)
  # test code
end

残念ながら、これは仕様とテストしているメソッドの実装を結び付けます。請願書を入手する別の方法を使用すると、これが機能しなくなる可能性があります。より回復力のあるアプローチでは、代わりにファクトリを使用し、適切な属性で請願書を作成する場合があります。

于 2013-02-22T04:54:14.260 に答える