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)总是返回假,即使其他测试证明它正在被添加到队列中。

如果我在测试中添加以下断言——

    Assert.AreEqual(obj, obj);

- 它失败。

我已经尝试添加mock.ExpectAndReturn("Equals", true, obj),但似乎没有这样做 - 我得到“对 Equals / 预期的调用过多:True / But was: False”。

坦率地说,我不在乎Equals被调用了多少次——我不想写一个那么严格的测试。有没有一种简单的方法可以在这里设置Equals为“正常”行为?

(顺便说一句,我应该使用更高级的 .NET 模拟库吗?我是 .NET 的新手,在 Java 中使用了 Mockito 之类的东西后,NUnit.Mocks 看起来很漂亮 2005。)


ETA:在看到Mockito 作者的好评后,我开始使用Moq;代码不那么混乱并且可以工作,所以这是一个开始。(奇怪的是,仍然失败。)Contains()AreEqual()

4

2 回答 2

0

我很好奇你在这里使用模拟的动机。如果您创建了实现 ISomeInterface 的类的常规实例,您的测试似乎会更简单。我想在你的情况下,实例化具体类一定不容易。如果你不能让它与模拟一起工作,一个解决方案是为这个测试实现一个具体的类。

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

于 2010-10-29T09:19:19.353 回答
0

为了结束而回答自己——答案似乎是“使用起订量”。

于 2011-01-19T18:41:01.277 回答