2011-02-09 22 views
0

イムを仕事とRepeat.Times()に問題がないようです。私は私の嘲笑オブジェクトのメソッドであることを確認したいRhinoのモック:最小限の時間が呼び出すための私のユニットテストフレームワークをからかうようRhinoの-モック3.6を使用して

正確に3回と呼ばれる。ドキュメントによると私はRepeat.Times(3)またはRepeat.Times(3, 3)を使用する必要があります。

しかし、私が観察しているのは少なくとも少なくともの3回の呼び出しであることがわかります。そのため、メソッドを4回呼び出すと、テストは引き続き実行されます。メソッドを2回だけ呼び出すと失敗します。

ここに私のコードです。何か問題はありますか?

 MockRepository mocks = new MockRepository(); 
     IJobServiceEvent mockedJSE; 
     using (mocks.Record()) 
     { 
      mockedJSE = mocks.DynamicMock<IJobServiceEvent>(); 
      Expect.Call(() => mockedJSE.TransactionListChanged(null)) 
       .Repeat.Times(3); 
     } 

     using (mocks.Playback()) 
     { 
      mockedJSE.TransactionListChanged(null); 
      mockedJSE.TransactionListChanged(null); 
      mockedJSE.TransactionListChanged(null); 
      mockedJSE.TransactionListChanged(null); 
     } 

答えて

2

StrictMockを使用する必要があります。 DynamicMockは、期待されないメソッド呼び出しを許可します。だからあなたのメソッドへの呼び出しは3回起こります(起こります)。しかし、それが4回目に発生したとき、それをDynamicMock(予期しない呼び出しが許可されている)として定義して以来、間違いではありません。

しかし、長い目で見れば、StrickMockを使用するとメンテナンスの頭痛になる可能性があります。テストではオブジェクトがどのように書かれているかが分かりすぎるからです。

単体テストのAAA(Arrange、Act、Assert)構文をお勧めします。私はものの(

のみ、特定の引数で呼び出すことを確認するためには、作られた

IJobServiceEvent mockedJSE = MockRepository.GenerateStub<IJobServiceEvent>(); 

mockedJSE.TransactionListChanged(null); 
mockedJSE.TransactionListChanged(null); 
mockedJSE.TransactionListChanged(null); 
mockedJSE.TransactionListChanged(null); 

mockedJSE.AssertWasCalled(s => s.TransactionListChanged(null), o => o.Repeat.Times(3, 3)); 

UPDATE:あなたのテストは上記のスタブを使って書くこともできますが、それでもあなたの方法上の3リミットコールを強制しますこれは基本的にメンテナンスの頭痛になる可能性がある厳しい模擬だと思う)、それらの呼び出しが行われていることを確認するためにarg constraintsオプションを3回使用してください。その後、引数を無視し、3回だけ呼び出されたことを確認する最終的な "AssertWasCalled"を持ってください:

mockedJSE.AssertWasCalled(s => s.TransactionListChanged(null), o => o.IgnoreArguments().Repeat.Times(3, 3)); 
+0

ありがとう、私の問題を解決! – Jan

+0

また、同じメソッドの2つの呼び出しを異なるパラメータで検証したいと思います。 Contraints()を使用し、AssertWasCalledを2回呼び出すことで、これを動作させることができます。しかし、このシナリオでは、どのような他のパラメータの組み合わせでも3番目の呼び出しが発生しないことをどのように確認するのですか?私はここで厳格な模擬を使わなければならないのですか? – Jan

+0

私の更新を見てください。それはあなたが探しているもののために働くはずです。 – PatrickSteele

関連する問題