2008-09-10 9 views
1

私が嘲笑しているインターフェースIFooがあります。このインタフェースには3つのメソッドがあります。テスト対象のシステムが3つの方法の少なくとも1つを呼び出すことをテストする必要があります。私は何回何回、何の引数をつけても気にしませんが、すべてのメソッドを無視し、IFooモックに触れないケースは失敗ケースです。Rhino Mock - メソッドのグループの少なくとも1つが呼び出されたことをどのようにテストできますか?

私はExpect.Callのドキュメントを見てきましたが、簡単な方法はありません。

アイデア?

答えて

1

関数getが呼び出されたときにrhinoモックをラムダに実行させることができます。このラムダは、カウンタをインクリメントすることができます。カウンター> 1をアサートしたら、完了です。

Don Kirkbyによるコメント: 私はMendeltがDoメソッドを参照していると信じています。

+0

私はMendeltがDoメソッドを参照していると思います。 –

+0

あまりにも短い答えに便利なコメントありがとうございます。それを質問に加えました。 – Mendelt

0

これはあなたの質問に答えるものではありませんが、私はRhino(または類似のフレームワーク/ライブラリ)のような何かを行う必要がある場合、私が先行する方法を知らなかったもの、手動のモックを作成するだけです。

いずれかのメソッドが呼び出された場合に、インターフェイスを実装し、public booleanフィールドをtrueに設定するクラスを作成することは簡単ですが、そのクラスにわかりやすい名前を付けることができます。コードはすぐにそれを理解します。

0

私が正しく理解していれば、指定された3つの方法のいずれかでインターフェイスが少なくとも1回は呼び出されていることを確認する必要があります。 the quick referenceを見て、私はあなたがRhino Mockでそれを行うことはできないと思います。

直感的に私はあなたが脆いテストを書こうとしていると思います。これはです。悪いことです。これは、テスト対象のクラスの不完全な指定を意味します。私は、テスト中のクラスとテストが既知の振る舞いを持つことができるように、デザインを考えることを強くお勧めします。

しかし、例では便利なので、いつでもこのようにすることができます(ですが、はありません)。

[TestFixture] 
public class MyTest { 

    // The mocked interface 
    public class MockedInterface implements MyInterface { 
     int counter = 0; 
     public method1() { counter++; } 
     public method2() { counter++; } 
     public method3() { counter++; } 
    } 

    // The actual test, I assume you have the ClassUnderTest 
    // inject the interface through the constructor and 
    // the methodToTest calls either of the three methods on 
    // the interface. 
    [TestMethod] 
    public void testCallingAnyOfTheThreeMethods() { 
     MockedInterface mockery = new MockedInterface(); 
     ClassUnderTest classToTest = new ClassUnderTest(mockery); 

     classToTest.methodToTest(); 

     Assert.That(mockery.counter, Is.GreaterThan(1)); 
    } 
} 

(誰かが私のコードをチェックし、私は今、私の頭からこれを書いているし、今では約一年のためのC#のものを書いていない)

私はなぜあなたを知って興味しかしこれをやっている。

+0

1つのエラー:クラスMockedInterfaceは、カウンタフィールドを公開する必要があります。それは単なるプライベートフィールドだと書かれています。 –

+0

@Andrei Rinea:実際にはMyTestは内部クラスであるため、MockedInterfaceのすべての内部を認識します。私は偶然内部クラスのプライベートフィールドを作ったが、外部クラスがまだアクセス可能であることがわかったときに驚いた。 – Spoike

関連する問題