私がモックしているインターフェイス IFoo があるとします。このインターフェイスには 3 つのメソッドがあります。テスト対象のシステムが 3 つのメソッドの少なくとも 1 つを呼び出すことをテストする必要があります。何回呼び出すか、どの引数で呼び出すかは気にしませんが、すべてのメソッドを無視し、IFoo モックに触れない場合は失敗のケースです。
Expect.Call のドキュメントを調べてきましたが、簡単な方法がわかりません。
何か案は?
私がモックしているインターフェイス IFoo があるとします。このインターフェイスには 3 つのメソッドがあります。テスト対象のシステムが 3 つのメソッドの少なくとも 1 つを呼び出すことをテストする必要があります。何回呼び出すか、どの引数で呼び出すかは気にしませんが、すべてのメソッドを無視し、IFoo モックに触れない場合は失敗のケースです。
Expect.Call のドキュメントを調べてきましたが、簡単な方法がわかりません。
何か案は?
関数が呼び出されたときに実行するラムダを rhino モックに与えることができます。このラムダは、カウンターをインクリメントできます。カウンター > 1 をアサートすれば完了です。
Don Kirkby のコメント: メンデルトは Do メソッドについて言及していると思います。
これがあなたの質問に答えているかどうかはわかりませんが、Rhino(または類似のフレームワーク/ライブラリ)でそのようなことをする必要がある場合、前もって行う方法がわからなかった場合は、作成するだけのほうがよいことがわかりました手動モック。
インターフェイスを実装し、いずれかのメソッドが呼び出された場合に public ブール値フィールドを true に設定するクラスを作成するのは簡単です。クラスにわかりやすい名前を付けることができます。これは、(最も重要なことに) 次にコードを表示する人がすぐにそれを理解します。
私が正しく理解している場合は、指定された 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#のものを書いていません)
なぜあなたがこれをしているのか知りたいです。