【问题标题】:Making a DynamicMock MockInstance equal to itself使 DynamicMock MockInstance 等于自身
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • myQueue object 是这里的被测系统。如果这里根本不需要,David 为什么要关心创建ISomeInterface 的“常规”对象?这将违反单元测试隔离规则。
  • 测试需要一个实现 ISomeInterface 的对象。设置一个模拟来做到这一点显然是行不通的。所以换一种方式。我可以看到没有违反单元测试的隔离。
  • ISomeInterface 上有大约 20 个必需的属性,以及一堆方法,这些方法都与我要测试的排队行为无关。我不想通过 (1) 实例化真实对象并必须设置所有这些属性,或者 (2) 使用所有属性和方法的存根实现滚动我自己的“模拟”来混淆测试。跨度>
  • @David 现在你的方法对我来说很有意义。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多