繁体   English   中英

MOQ验证无效

[英]MOQ verify not working on void

使用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调用

正如您所见,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一起正常工作)

CacheItemPolicy是否实现了接口? 如果是这样,您会尝试验证通话吗?

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), It.IsAny<ICacheItemPolicy>()), Times.Once());

或者界面名称是什么?

我有同样的问题。 事实上,我的SUT方法收到了一个接口,这就是它传递给模拟对象的内容。 虽然该类可以实现接口,但接口仍然是不同的类型。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM