C# 最小起订量验证未在void上工作

C# 最小起订量验证未在void上工作,c#,moq,verify,C#,Moq,Verify,我有一个奇怪的问题,当使用最小起订量 在一个项目中,当我试图验证一个方法是否被调用时,它会说它没有被调用。当我调试测试时,它会清楚地调用该方法 这是一个简单的缓存对象,我想看看是否向缓存中添加了内容。我有(除其他外)Add、Contains和Get方法 我的验证在以下方法上运行良好: bool Contains(string key); T Get<T>(string key); 我已尝试使用我给出的方法的精确值,如下所示: mockedCache.Verify(p => p

我有一个奇怪的问题,当使用最小起订量

在一个项目中,当我试图验证一个方法是否被调用时,它会说它没有被调用。当我调试测试时,它会清楚地调用该方法

这是一个简单的缓存对象,我想看看是否向缓存中添加了内容。我有(除其他外)Add、Contains和Get方法

我的验证在以下方法上运行良好:

bool Contains(string key);
T Get<T>(string key);
我已尝试使用我给出的方法的精确值,如下所示:

mockedCache.Verify(p => p.Add(LOCATION_CACHE_KEY, locations, policy), Times.Once());
使用它,伊萨尼

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(),
     It.IsAny<CacheItemPolicy>()), Times.Once());
mockedCache.Verify(p=>p.Add(It.IsAny(),It.IsAny(),
It.IsAny()),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());
mockedCache.Verify(p=>p.Add(It.IsAny()、It.Is(o=>o是IEnumerable)、It.IsAny()、Times.Once());

否则,您可以查看Moq的更新版本-我已经测试了您的原始场景(使用断言中的
It.IsAny
),并且它可以正确地与Moq v4.0配合使用)

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

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), It.IsAny<ICacheItemPolicy>()), Times.Once());
mockedCache.Verify(p=>p.Add(It.IsAny(),It.IsAny(),It.IsAny()),Times.Once());
或者不管接口的名称是什么


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

Moq倾向于编写断言消息中的内容。那叫什么?另外,您是否尝试过在验证时不使用
。。。这是打字错误吗
It.IsAny
。它应该是
It.IsAny()
您是否考虑到您的代码错误,并且没有调用Add?It.IsAny(),尝试用对象替换它可能会表现出您尝试使用以下参数调用Verify的行为:mockedCache.Verify(p=>p.Add(It.IsAny,It.IsAny(),It.IsAny()),Times.Once()?
mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), It.IsAny<ICacheItemPolicy>()), Times.Once());