34

我的团队最近决定使用 Moq 作为我们的模拟框架,因为它具有极大的灵活性和高度可读的语法。由于我们是新手,所以我在看似简单的问题上绊倒了——搜索(这里,谷歌等)发现很多关于起订量其他细微差别的讨论,但不一定是我所追求的,并且几个看似相关的问题变成了红鲱鱼。

我们正在测试一个具有外部依赖项的类(准确地说是 Amazon SimpleDb),但不希望我们的测试绑定到实时连接。具体方法:

  • 应用一些“业务”逻辑
  • 如果合适,通过我们构建的提供程序调用 SDB,让我们调用它SaveItem()

我想对此进行单元测试,以便我们设置所需的上下文并确保它SaveItem()被调用,但是以一种SaveItem()真正没有被调用的方式(因为 A)SDB 的提供者是一个没有完全水合的模拟,可能会爆炸B)我不想为那笔交易支付成百上千次)。

在处理返回值的方法时,这是微不足道的。

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo");

不过,在我上面概述的情况下,我的 " SaveItem()" 方法是无效的,因此使用 MoqReturns()方法的选项不可用。虽然我可以设置一个回调来验证是否SaveItem()被调用,但我似乎无法让它实际上不做任何事情。

天真/充满希望,我认为以下方法会起作用,但它似乎仍然调用该方法:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>()));

所以百万美元的问题:以下虚构代码的起订量是多少?

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE();
4

1 回答 1

38

如果该SaveItem()方法是虚拟的或抽象的,并且您没有设置Callbase = true,那么应该重新实现该方法,以便模拟什么都不做。

你应该能够做到:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable();

...  test here ...

mockDb.Verify();
于 2009-07-29T22:59:31.323 回答