我的团队最近决定使用Moq作为我们的模拟框架,因为它具有极大的灵活性和高度可读的语法。由于我们刚接触它,我在看似简单的问题上磕磕绊绊 - 搜索(这里,谷歌等)找到了关于Moq其他细微差别的大量讨论,但不一定是我所追求的,以及一些看似相关的问题变成了红色的鲱鱼。
我们正在测试一个具有外部依赖关系的类(确切地说是Amazon SimpleDb)但不希望我们的测试绑定到实时连接。一种特殊的方法:
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();
答案 0 :(得分:34)
如果SaveItem()
方法是虚拟的或抽象的,并且您没有设置Callbase = true
,则应该重新实现该方法,以便通过模拟执行任何操作。
你应该可以这样做:
mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable();
... test here ...
mockDb.Verify();