【发布时间】:2010-10-28 17:00:53
【问题描述】:
尝试使用 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 / But was: False”。
坦率地说,我不在乎Equals 被调用了多少次——我并不是想写一个那么严格的测试。有没有一种简单的方法来设置Equals 在此处“正常”运行?
(顺便说一句,我应该使用更高级的 .NET 模拟库吗?我是 .NET 的新手,在 Java 中使用 Mockito 之类的东西后,NUnit.Mocks 看起来很漂亮 2005。)
ETA:看到a favorable note from the author of Mockito后,我开始使用Moq;代码有点不那么混乱,Contains() 可以工作,所以这是一个开始。 (奇怪的是,AreEqual() 仍然失败。)
【问题讨论】:
-
我会推荐 Rhino Mocks - 它是成熟而强大的工具。关于您的问题 - 您如何测试队列对象的相等性?
-
我没有——我只是假设这就是 System.Collections.Generic.Queue.Contains() 正在做的事情。 :) (但进一步检查可能不是。)当我开始编写 ISomeInterface 的实际实现时,我将确保 Contains() 在其上工作。
-
+1 尝试起订量!这是我选择的隔离框架。
标签: unit-testing mocking nunit nunit-mocks