尝试使用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()
仍然失败了。)
答案 0 :(得分:0)
我很好奇你在这里使用模拟的动机。如果您创建了一个实现ISomeInterface的类的常规实例,那么您的测试似乎会更简单。我想在你的情况下,必须没有简单的实例化具体类。如果你无法使用模拟,那么解决方案就是为这个测试实现一个具体的类。
我没有使用过nunit.mocks,我通常使用Rhino Mocks,它通常效果很好,而且Moq框架也很受欢迎。
答案 1 :(得分:0)
为了关闭而回答自己 - 答案似乎是“使用Moq。”