使用moq时我有一个奇怪的问题。
在一个项目中,当我尝试验证方法已被调用时,它表示它没有。当我调试测试时,它清楚地调用了方法。
这是一个简单的缓存对象,我想看看我是否在缓存中添加了一些东西。我有(其中包括)Add,Contains和Get方法。
我的验证在这些方法上运行良好:
bool Contains(string key);
T Get<T>(string key);
但不是这个:
void Add(string key, object objectToCache, CacheItemPolicy policy);
我已尝试使用我给该方法的确切值:
mockedCache.Verify(p => p.Add(LOCATION_CACHE_KEY, locations, policy), Times.Once());
使用It.IsAny
mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(),
It.IsAny<CacheItemPolicy>()), Times.Once());
无论我尝试什么,我都会得到它被称为0次的响应。
我以前从未见过这种行为。有谁能告诉我出了什么问题?
由于
迈克尔
更新: 正如@SergRogovtsev建议的那样,我查看了生成的输出moq。
我的方法没有用IEnumerable调用,而是用List
调用答案 0 :(得分:0)
正如您所见,Moq没有检查传递的参数的确切类型,而不仅仅是它们来自您声明的类型。如果你想要这个功能,你可能需要使用这样的东西:
mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.Is<object>(o => o is IEnumerable<string>), It.IsAny<CacheItemPolicy>()), Times.Once());
否则你可以考虑获取Moq的更新版本 - 我已经测试了你的原始场景(在断言中使用It.IsAny<IEnumerable<string>>
)并且它与Moq v4.0一起正常工作)
答案 1 :(得分:0)
CacheItemPolicy
是否实现了接口?如果是,您会尝试使用
mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), It.IsAny<ICacheItemPolicy>()), Times.Once());
或者界面名称是什么?
我遇到了同样的问题。事实上,我的SUT方法收到了一个接口,这就是它传递给模拟对象的内容。虽然该类可以实现接口,但接口仍然是不同的类型。希望这会有所帮助。