2

私はrspec-spiesを使用していますが、すべての呼び出しが行われた後にスパイを検査する方法があるかどうか疑問に思っています。

たとえば、次のようなことをすると

# setup
Post.stub(:find).with(@post.id).and_return(@post)

do_something_to_call_post_find()

# verify find was called
Post.should have_received(:find).with(@post.id)

これはうまく機能しますが、Postが予期した引数を受け取らなかった場合、役に立たないエラー メッセージが表示されます (基本的に、「Post は find を 123 で受け取るべきでした」)。代わりに、実際の呼び出しが何であったかを確認したいと思い`findます。

の直後に一時停止できdo_something_to_call_post_find()ますが、スタブ/スパイへのすべての呼び出し/引数を一覧表示する方法はありますか?

実際の使用例 これは今日私を捕まえました-私は期待していましたPost.should have_received(:find).with(@post.id)、ここで@post.id is an integer、私のコントローラーテストはパラメーター(IDを含む)を文字列として渡します。実際の呼び出しを調べることができれば、123"123"と の違いは明らかだったでしょう。

4

1 に答える 1

4

この不足は、改善された rspec-spies 機能を組み込んだ rspec 2.14.0.rc1 ではもはや問題ではなく、現在 github で入手できます。

たとえば、次の仕様を実行します。

class Foo
  def self.bar(arg)
  end
end

describe "test" do
  it "should show differences" do
    Foo.stub(:bar)
    Foo.bar(123)
    Foo.should have_received(:bar).with('123')
  end
end

次の出力が生成されます。

F

Failures:

  1) test should show differences
     Failure/Error: Foo.should have_received(:bar).with('123')
       <Foo (class)> received :bar with unexpected arguments
         expected: ("123")
              got: (123)
     # ./foo_spec.rb:10:in `block (2 levels) in <top (required)>'

Finished in 0.00082 seconds
1 example, 1 failure

Failed examples:

rspec ./foo_spec.rb:7 # test should show differences
Peters-MacBook-Air-2:botmetrics palfvin$ 

更新: https://github.com/technicalpickles/rspec-spies/blob/master/lib/rspec-spies.rbhave_receivedでのマッチャーの定義の調査といくつかの非公式のテストに基づいて、受信したメッセージが次のようにプログラムでアクセスできます。

Foo.__send__(:__mock_proxy).instance_variable_get("@messages_received")

Fooあなたのテストダブルはどこですか。

于 2013-07-02T20:32:06.773 に答える