2

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()

4

2 に答える 2

0

締めくくるために自分自身に答える-答えは「Moqを使う」のようです。

于 2011-01-19T18:41:01.277 に答える
0

ここでモックを使用する動機について知りたいです。ISomeInterface を実装するクラスの通常のインスタンスを作成すると、テストがより簡単になるようです。あなたの場合、具体的なクラスを簡単にインスタンス化することはできないに違いないと思います。モックで動作させることができない場合、解決策は、このテストのためだけに具体的なクラスを実装することです。

私は nunit.mocks を使用したことがありません。通常は Rhino Mocks を使用しますが、これは一般的にかなりうまく機能し、Moq フレームワークも人気があります。

于 2010-10-29T09:19:19.353 に答える