web-dev-qa-db-ja.com

RSpec:毎回異なる引数を持つメソッドへの複数の呼び出しを指定する

Rspec(1.2.9)では、オブジェクトが毎回異なる引数を持つメソッドへの複数の呼び出しを受け取ることを指定する正しい方法は何ですか?

この混乱する結果のために私は尋ねます:

describe Object do

  it "passes, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(2)
  end

  it "fails, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1) # => Mock "foo" expected :bar with (1) once, but received it twice
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(1)
    foo.bar(2)
  end

  it "fails, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(2) # => Mock "foo" received :bar out of order
    foo.bar(1)
  end

  it "fails, as expected, but with an unexpected message" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(999) # => Mock "foo" received :bar with unexpected arguments
                 # =>   expected: (1)
                 # =>         got (999)
  end

end

最後のエラーメッセージは「予想(1)」ではなく「予想:(2)」であると予想していました。 rspecを間違って使用しましたか?

38
Wayne Conrad

これに似ています 質問 。推奨される解決策は、メッセージの混乱を避けるためにas_null_objectを呼び出すことです。そう:

describe Object do
  it "fails, as expected, (using null object)" do
    foo = mock('foo').as_null_object
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(999) # => Mock "foo" expected :bar with (2) once, but received it 0 times
  end
end

出力は2番目のケースと同じではありませんが(つまり、「2は期待されていたが999が得られました」)、期待どおりではなかったことを示しています。

37
zetetic