NUnitを使用して、オブジェクトをキューに追加するメソッドをテストしようとしています。オブジェクトがすでにキューに入れられている場合は例外をスローしますがQueue.Contains()
、モックオブジェクトがすでにキューにあることを検出できないため失敗します。
テスト対象のメソッドは非常に単純です。
public void Enqueue(ISomeInterface obj) {
if (myQueue.Contains(obj)) {
throw new InvalidOperationException("Already queued");
}
myQueue.Enqueue(obj);
}
そして、テストもそうです:
[Test()]
public void TestQueueAlreadyQueued()
{
DynamicMock mock = new DynamicMock(typeof (ISomeInterface));
ISomeInterface obj = (ISomeInterface) mock.MockInstance;
queueulator.Enqueue(obj);
try {
queueulator.Enqueue(obj);
Assert.Fail("Exception expected");
} catch (InvalidOperationException e) {
// test passed
}
}
これは失敗しmyQueue.Contains(obj)
ます。他のテストでキューに追加されていることが証明されていても、常にfalseが返されます。
テストに次のアサーションを追加すると、次のようになります。
Assert.AreEqual(obj, obj);
-失敗します。
追加しようとしましmock.ExpectAndReturn("Equals", true, obj)
たが、うまくいかないようです。「Equalsへの呼び出しが多すぎます/期待:True /しかしだった:False」と表示されます。
そして率直に言って、私は何度Equals
呼ばれるかは気にしません-私はそれほど厳密なテストを書こうとはしていません。Equals
ここで「正常に」動作するように設定する簡単な方法はありますか?
(補足として、使用する必要のあるより高度な.NETモックライブラリはありますか?私は.NETを初めて使用し、JavaでMockitoなどを使用した後、NUnit.Mocksはかなり2005年のようです。)
ETA: Mockitoの作者からの好意的なメモを見て、 Moqを使い始めました。コードは少し雑然としていて機能するので、それが始まりです。(奇妙なことに、それでも失敗します。)Contains()
AreEqual()