使用Moq"短路"无效方法?

bak*_*san 30 c# methods unit-testing moq mocking

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

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

  • 应用一些"业务"逻辑
  • 如果合适,通过我们建立的提供商调用SDB呼叫,让我们称之为 SaveItem()

我想对这进行单元测试,以便我们设置所需的上下文并确保SaveItem()调用它,但是以一种SaveItem()真正未被调用的方式(因为A)SDB的提供者是一个没有完全补充的模拟器,并且可能会炸弹和B)我不想为这笔交易付出数十万次).

在处理返回值的方法时,这很简单.

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo");
Run Code Online (Sandbox Code Playgroud)

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

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

mockDb.Setup(d => d.SaveItem(It.IsAny<object>()));
Run Code Online (Sandbox Code Playgroud)

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

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE();
Run Code Online (Sandbox Code Playgroud)

wom*_*omp 34

如果SaveItem()方法是虚拟的或抽象的,并且您没有设置Callbase = true,那么应该重新实现该方法以通过模拟执行任何操作.

你应该能够做到:

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

...  test here ...

mockDb.Verify();
Run Code Online (Sandbox Code Playgroud)

  • +1; 此外,您还可以通过调用mockDb.VerifyAll()验证所有调用,无论Verifiable()标志如何. (2认同)