尝试使用 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()