【问题标题】:Verifying methods called with Moq验证使用 Moq 调用的方法
【发布时间】:2011-09-14 10:40:15
【问题描述】:

试图验证一个方法在模拟中被调用,但似乎无法弄清楚为什么我不断收到一个没有被调用的异常。有问题的方法如下:

public class CustomerSyncEngine {
public CustomerSyncEngine(ILoggingProvider loggingProvider, ICrmProvider crmProvider, ICacheProvider cacheProvider) {
  Logger = loggingProvider;
  CrmProvider = crmProvider;
  CacheProvider = cacheProvider;
}
public virtual void SyncPickLists() {
  Logger.LogBeginPicklistSync();

  // get all the pick lists from the local cache
  var localCachePickLists = CacheProvider.GetPickLists().ToList();
  // get all the pick lists from the remote system
  var crmPickLists = CrmProvider.GetPickLists().ToList();

  // build a sync plan
  var changes = BuildPickListUpdatePlan(localCachePickLists, crmPickLists).ToList();

  // run the sync
  RunPickListSync(changes);

  Logger.LogEndPicklistSync();
}
}

然后我写了一个这样的测试:

[TestMethod]
public void TestSyncPickLists() {
  // arrange
  var mockCrm = new Mock<ICrmProvider>();
  mockCrm.Verify(x => x.GetPickLists(), Times.Once(), "ICrmProvider.GetPickLists not called");

  var mockCache = Mock.Of<ICacheProvider>();
  var mockLogger = Mock.Of<ILoggingProvider>();

  // act
  var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm.Object, mockCache);
  syncEngine.SyncPickLists();

  // assert
  mockCrm.VerifyAll();
}

当我运行它时,测试失败并显示我在 Verify() 中指定的消息。所以我设置了一堆断点,我看到测试从不调用 syncEngine.SyncPickLists() 方法,这让我很困惑。所以我注释掉了两个 Verify() 和 VerifyAll() 语句,现在我看到事情被正确调用了。我在这里想念什么?看起来我正在做的正是Quickstartthis thread 中显示的内容。

【问题讨论】:

  • 你在调用SyncPickLists 之后调用Verify - 这不是一个延迟的事情,因为它会在那里检查值。将您的呼叫下方的行移至SyncPickLists,您应该可以通过。

标签: c# moq


【解决方案1】:

Tejs 在对原始帖子的评论中发布的答案。

您在调用 SyncPickLists 之后调用验证 - 这不是延迟的事情,因为它会在那时和那里检查值。将调用下方的行移至 SyncPickLists,您应该可以通过。 – 泰斯

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2013-01-01
    • 2016-06-12
    • 1970-01-01
    • 2011-03-11
    • 2010-09-28
    相关资源
    最近更新 更多