2009-05-20 7 views
11

誰でも次のテストが失敗していない理由を教えてもらえますか?Rhinoモック:Repeat.Once()は機能しませんか?

[Test] 
public void uhh_what() { 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Expect(x => x.Notify()).Repeat.Once(); 
    a.Notify(); 
    a.Notify(); 
    a.VerifyAllExpectations(); 
} 

は本当に今、私はすべての私のテストは信頼できないことを心配している...私はクレイジーじゃない確認するために、目の第二の対を必要とします。

答えて

23

すでにthread on the RhinoMocks groupがあります。

GenerateMockは動的モックを作成します。動的モックは、指定されていない(=期待される)コールを許可します。これが起こると、null(または戻り値の型のデフォルト値)だけが返されます。

注:リピートは、予想で指定されていても、期待値ではなく、動作(スタブのような)の仕様です。常に

[Test] 
public void uhh_what() 
{ 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Expect(x => x.Notify()).Repeat.Once(); 
    a.Stub(x => x.Notify()).Throw(new InvalidOperationException("gotcha")); 
    a.Notify(); 

    // this fails 
    a.Notify(); 

    a.VerifyAllExpectations(); 
} 

それとも

[Test] 
public void uhh_what() 
{ 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Notify(); 
    a.Notify(); 

    // this fails 
    a.AssertWasCalled(
     x => x.Notify(), 
     o => o.Repeat.Once()); 
} 
+1

oh!私はAssertWasCalledがより多くの仕様を行うことができる第2引数を持っていることを知らなかった。 –

+1

PartialMockを実行した場合、PartialMockと同じ問題です。 – Dennis

+1

最初の解決策(例外を投げる場所)_will_ 'Notify'が複数回呼び出されると、テストが失敗します。しかし、一度だけ呼び出された場合(少なくともテスト対象のコードで行うべきことだと思う)、それは決して来ない 'Notify'への_second_呼び出しを期待しているので、テストは通りません。 Repeat.Once() 'とそれに続く' a.Stub(x => x.Notify())を設定する。 '' a.Expect(x => x.Notify()ジョブ。 – geoffmazeroff

7

をGenerateMock(または一般に動的なモックで)を使用している場合、私は:あなたが呼び出し、特定の数、より多くを持っ避けたい場合は、あなたが書くことができ

次のように精神的に挿入してください:

a.Expect(x => x.Notify())。 * [AtLeast] * Once();

関連する問題