【问题标题】:C# Moq how to get all method invocationsC# Moq 如何获取所有方法调用
【发布时间】:2017-12-09 16:33:30
【问题描述】:

我正在通过 moq 创建一个模拟界面。

我的应用程序代码使用不同的输入组合调用我的模拟的不同方法。当我用错误的输入执行 verify() 时,会抛出一个异常,列出所有方法调用。

我想获取这些方法调用,执行一些清理操作并以不同的格式显示给用户。是否可以在调用验证之前获取所有方法调用?

示例代码:

var mock = new Mock<ILoveThisFramework>();


  mock.Setup(framework => framework.DownloadExists("2.0.0.0"))
      .Returns(true);

  // Hand mock.Object as a collaborator and exercise it, 
  // like calling methods on it...
  ILoveThisFramework lovable = mock.Object;
  bool download = lovable.DownloadExists("2.0.0.0");

  // Verify that the given method was indeed called with the expected value at most once

// it will throw exception which will include method invocations. I want to get method invocations out and reformat them. 

  mock.Verify(framework => framework.DownloadExists("3.0.0.0"), Times.AtMostOnce());

【问题讨论】:

    标签: c# .net unit-testing moq


    【解决方案1】:

    Moq 的下一个主要迭代版本 5 将允许这种模拟检查。

    更新:从 Moq 4.9 开始,您将能够通过新的 Mock.Invocations 集合属性检查所有记录的模拟调用。

    从 4.8.2 版开始,Moq 不允许您获取所有记录的调用,因为保存这些调用 (Mock.Invocations) 的集合未公开。

    在 Moq 4 中暴露 Mock.Invocations 实际上是一个相当简单的更改。我们正在调查它;见this pull request on GitHub(这已经发生了,见上面的更新评论。)

    可以理论上使用反射来获取该私有数据,但我不推荐这种方法。私有位是私有的是有原因的。它们不是公共合同的一部分,因此如有更改,恕不另行通知。

    如果您只是处理一种设置,您可以简单地捕获参数值,如this answer 建议的那样。

    var someMethodArgs = new List<TArg>();
    mock.Setup(m => m.SomeMethod(arg: Capture.In(someMethodArgs)));
    

    【讨论】:

      【解决方案2】:

      好吧,如果你想reformat他们,请执行以下操作

      var tags = new List<string>();
      var mock = new Mock<ILoveThisFramework>();
      
        mock.Setup(framework => framework.DownloadExists(It.IsAny<string>()))
           .Returns((string tag) => {
             tags.Add(tag);
             return true;
          });
      
      Assert.IsTrue(tags.Contains("3.0.0.0"), $"3.0.0.0 never passed to `DownloadExists(), only values passed {string.Join(',', tags)}");
      

      【讨论】:

      • 我认为有.Callback(tag =&gt; { tags.Add(tag); }).Returns(true); 会更整洁,它将正在发生的事情分开
      • 如果你只想为每次调用捕获参数值,你可以使用Capture。例如,mock.Setup(m =&gt; m.DownloadExists(Capture.In(tags)))
      猜你喜欢
      • 2020-08-04
      • 2011-03-11
      • 1970-01-01
      • 2010-10-06
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多