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

时间:2009-07-29 22:50:04

标签: c# unit-testing mocking methods moq

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

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

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

我想对此进行单元测试,以便我们设置所需的上下文并确保调用SaveItem(),但是实际上未调用SaveItem()(因为A)SDB的提供者是一个没有完全补充的模拟,可能会爆炸和B)我不想为这笔交易支付数百次。)

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:34)

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

你应该可以这样做:

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

...  test here ...

mockDb.Verify();