使用Moq“短路”无效方法?

我的团队最近决定使用Moq作为我们的模拟框架,因为它具有极大的灵活性和高度可读的语法。 由于我们刚接触它,我在看似简单的问题上磕磕绊绊 – 搜索(这里,谷歌等)找到了关于Moq的其他细微差别的大量讨论,但不一定是我所追求的,以及一些看似相关的问题变成了红色的鲱鱼。

我们正在测试一个具有外部依赖关系的类(确切地说是Amazon SimpleDb)但不希望我们的测试绑定到实时连接。 一种特殊的方法:

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

我想对它进行unit testing,以便我们设置所需的上下文并确保SaveItem() ,但是实际上没有调用SaveItem() (因为A)SDB的提供者是一个不是的模拟器完全水合,很可能炸弹和B)我不想为这笔交易付出数百次。)

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

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

在我概述的情况下,我的“ SaveItem() ”方法是无效的,因此使用Moq的Returns()方法的选项不可用。 虽然我可以设置一个回调来validationSaveItem()是否被调用,但我似乎无法让它实际上没有做任何事情。

天真/充满希望,我认为以下内容可行,但似乎仍然会调用该方法:

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

所以百万美元的问题:以下虚构代码的Moq是什么?

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

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

你应该能够做到:

 mockDb.Setup(d => d.SaveItem(It.IsAny())).Verifiable(); ... test here ... mockDb.Verify();