2014-01-18 1 views
8

RSpec(具体的にはrspec-mocks)の場合、Message ExpectationsTest Spiesの違いは何ですか?それらは同様のように見え、readmeの別々のセクションとして互いに隣り合って表示されます。あなたはいつもあなたは、基本的なクラスへの期待のために、テストのスパイを使用することはできませんRSpecでは、メッセージの期待値(受信)とテストスパイ(have_received)の違いは何ですか?

expect(validator).to receive(:validate) # message expectation 

expect(validator).to have_received(:validate) # test spy 

答えて

6

メッセージの期待はどのオブジェクトに設定し、何かが将来にそのオブジェクトに起こるだろう(あるいは起こらない)された宣言を表現することができます。その後のテスト実行中に期待値に違反すると、違反が発生した時点でテストが失敗します。テストが終了するまでに期待値が満たされていない場合は、テストも失敗します。メソッドの

have_receivedファミリは、ただテストダブルで動作し、ダブルの作成までの時間から現在のメソッド呼び出しにより、過去でダブルに何が起こったか調べます。その時点で成功または失敗します。この後方探索メカニズムのサポートは、この時点でrspec-mocksの標準的な部分であるため、「テストスパイ」という用語は少し誤解を招きます。あなたは "テストスパイ"を作るために "特別な"何もしません。

3

は違い何である、すなわち。

例:スパイでこれを行う方法はありません

expect(User).to receive(:new) 

(あなたは、依存関係の注入を行う場合を除きます)。

さて、あなたは次の手順を実行できます。

user = double('user', save: true) 
expect(User).to receive(:new).and_return user 

User.new.save 

expect(user).to have_received(:save) 

あなたははっきりとそれを参照してください。

  • 、あなたが実際のコード(ルックスのそれのようなものを実行する前に、実際のオブジェクトに期待を設定する必要がありますコードをトリガする前に期待を設定するのはおかしい)

  • 実際のコードの後に​​スパイの期待値を設定すると、より自然になります

関連する問題