2012-08-13 67 views
3

当使用moq时,我有一个奇怪的问题。最小起订量验证不起作用无效

在一个项目中,当我尝试验证某个方法已被调用时,它说它没有。当我调试测试时,它清楚地调用了该方法。

这是一个简单的缓存对象,我想查看是否将某些内容添加到缓存中。我有(其中包括)添加,包含和获取方法。

我的验证工作正常用以下方法:

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建议,我看着生成的输出最小起订量。

不调用了IEnumerable但名单

+0

Moq倾向于写出在断言消息中被称为*的东西。叫什么?另外,你有没有'时代'尝试? – 2012-08-13 14:33:50

+1

在您验证...这是一个错字? 'It.IsAny '。它应该是'It.IsAny ()' – 2012-08-13 14:34:45

+2

你是否认为你的代码是错误的,并且Add没有被调用? – cadrell0 2012-08-13 14:35:26

回答

0

如你所见,起订量不检查通过的确切参数类型的我的方法whas,不只是他们从你断言类型派生。如果你想要的功能,你可能需要使用这样的事情:

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.Is<object>(o => o is IEnumerable<string>), It.IsAny<CacheItemPolicy>()), Times.Once()); 

否则,你可能会考虑获取起订量的更新版本 - 我已经测试您的原始方案(在断言使用It.IsAny<IEnumerable<string>>),它工作正常与Moq v4.0)

0

CacheItemPolicy是否实现了一个接口?如果是这样,你会尝试验证呼叫与

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

或任何接口的名称是?

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