我正在通过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());
答案 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)}");