使DynamicMock MockInstance等于它自己

时间:2010-10-28 17:00:54

标签: unit-testing mocking nunit nunit-mocks

尝试使用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 / Expected:True /但是:False”。

坦率地说,我并不关心Equals有多少次被召唤 - 我不打算写一个严格的测试。是否有一种简单的方法可以将Equals设置为“正常”在这里?

(作为旁注,是否有一个更高级的.NET模拟库我应该使用?我是.NET的新手,在使用像Mockito这样的Java之后,NUnit.Mocks看起来很漂亮。)


ETA :在看到Moq后,我开始使用a favorable note from the author of Mockito;代码有点混乱,Contains()有效,所以这是一个开始。 (奇怪的是,AreEqual()仍然失败了。)

2 个答案:

答案 0 :(得分:0)

我很好奇你在这里使用模拟的动机。如果您创建了一个实现ISomeInterface的类的常规实例,那么您的测试似乎会更简单。我想在你的情况下,必须没有简单的实例化具体类。如果你无法使用模拟,那么解决方案就是为这个测试实现一个具体的类。

我没有使用过nunit.mocks,我通常使用Rhino Mocks,它通常效果很好,而且Moq框架也很受欢迎。

答案 1 :(得分:0)

为了关闭而回答自己 - 答案似乎是“使用Moq。”