【问题标题】:MOQ verify not working on void最小起订量验证无效
【发布时间】:2012-08-09 19:18:40
【问题描述】:

我在使用 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());

使用它.IsAny

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

无论我尝试什么,我都会得到它被调用 0 次的响应。

我以前从未见过这种行为。谁能告诉我怎么了?

谢谢

迈克尔

更新: 正如@SergRogovtsev 建议的那样,我查看了生成的输出起订量。

我的方法不是用 IEnumerable 而是用 List 调用的

【问题讨论】:

  • Moq 倾向于在断言消息中写入 被调用的。叫什么?另外,你试过没有Times吗?
  • 在您的验证中...这是一个错字吗? It.IsAny&lt;string&gt;。应该是It.IsAny&lt;string&gt;()
  • 您是否考虑过您的代码错误并且没有调用 Add?
  • It.IsAny>(),尝试将其替换为 Object may be
  • 您是否尝试过使用以下参数调用验证:mockedCache.Verify(p => p.Add(It.IsAny, It.IsAny(), It.IsAny()), Times.Once()); ?

标签: c# moq verify


【解决方案1】:

如您所见,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&lt;IEnumerable&lt;string&gt;&gt;)并且它与 Moq v4.0 一起正常工作)

【讨论】:

    【解决方案2】:

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

    验证通话吗
    mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), It.IsAny<ICacheItemPolicy>()), Times.Once());
    

    或者接口的名称是什么?

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

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多