1

私がモックしているインターフェイス IFoo があるとします。このインターフェイスには 3 つのメソッドがあります。テスト対象のシステムが 3 つのメソッドの少なくとも 1 つを呼び出すことをテストする必要があります。何回呼び出すか、どの引数で呼び出すかは気にしませんが、すべてのメソッドを無視し、IFoo モックに触れない場合は失敗のケースです。

Expect.Call のドキュメントを調べてきましたが、簡単な方法がわかりません。

何か案は?

4

3 に答える 3

1

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

Don Kirkby のコメント: メンデルトは Do メソッドについて言及していると思います。

于 2008-09-10T09:12:53.533 に答える
0

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

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

于 2008-09-12T09:53:17.477 に答える
0

私が正しく理解している場合は、指定された 3 つのメソッドのいずれかでインターフェイスが少なくとも 1 回呼び出されていることを確認してください。クイックリファレンスを見ると、Rhino Mocks でそれができるとは思えません。

直観的に、脆弱なテストを書こうとしていると思いますが、これは悪いことです。これは、テスト対象のクラスの仕様が不完全であることを意味します。テスト対象のクラスとテストが既知の動作を持つように、設計を熟考することを強くお勧めします。

ただし、例で役立つようにするために、いつでもこのようにすることができます (ただし、しないでください)。

[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));
    }
}

(誰かが私のコードをチェックしてください。私はこれを頭から書き、約1年間C#のものを書いていません)

なぜあなたがこれをしているのか知りたいです。

于 2008-09-12T10:27:07.317 に答える