C#Moq如何获取所有方法调用

时间:2017-12-09 16:33:30

标签: c# .net unit-testing moq

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

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

我希望获得这些方法调用,执行一些清理并以不同的格式显示给用户。是否可以在调用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());

2 个答案:

答案 0 :(得分:5)

即将到来的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)));

答案 1 :(得分:0)

好吧,如果您想要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)}");