gpt4 book ai didi

c# - 使用 Moq 验证是否已调用 void 方法

转载 作者:行者123 更新时间:2023-12-03 22:20:24 24 4
gpt4 key购买 nike

我有一个类负责构建用于导出的 PPT 幻灯片。为了对此进行单元测试,我创建了一个接口(interface),以便可以使用 Moq 进行模拟;到目前为止一切都很好。但是,在尝试测试我的方法是否已被调用时,我遇到了困难。这是一个 void 方法,所以此时我只想知道该方法已被命中。

这是我的界面:

interface IPowerpointExporter
{
void AddSlides(int amount);

void setTitle(string title);
}

这是我的单元测试:

[TestMethod]
public void testPPTObject()
{
var mockPPT = new Mock<IPowerpointExporter>();
mockPPT.Setup(m => m.AddSlides(1)).Verifiable();
mockPPT.Object.AddSlides(1);
mockPPT.VerifyAll();
}

但是,当我调用 AddSlides() 时,我得到了一个 GeneratorException。对此的解释是我的 IPowerpointExporter 不可访问。我有一种感觉,这是因为我试图在接口(interface)上调用一个方法,尽管我不确定,因为此时我的对象位于 mockPPT.Object.AddSlides();

请注意,我还尝试了以下尝试使用实际对象而不是 Interface.Object。这也给出了同样的异常(exception):

[TestMethod]
public void testPPTObject()
{
var mockPPT = new Mock<IPowerpointExporter>();
mockPPT.Setup(m => m.AddSlides(1)).Verifiable();

ExportPowerPoint temp = (ExportPowerPoint)mockPPT.Object;
temp.AddSlides(1);
mockPPT.VerifyAll();
}

如何使用 Moq 检查我的方法是否已被调用?我在上面所做的是否正确?

最佳答案

您可能会遇到该异常,因为您的接口(interface)不是public,或者对 Moq 程序集不可见。参见 this question解决这个问题。

如果这只是帮助您学习 Moq 的虚拟代码,那么请不要继续阅读。


但是,如果这是您认为有值(value)的实际测试,那么您还有其他更根本的问题。在您的第一个示例中,您完全没有做任何事情来测试您的代码!让我们逐行分析一下:

var mockPPT = new Mock<IPowerpointExporter>();

您创建了 IPowerpointExporter 接口(interface)的模拟,目前一切顺利。

mockPPT.Setup(m => m.AddSlides(1)).Verifiable();

您告诉 mock 期待调用它的 AddSlide 方法,参数为 1,并且可以验证该方法。到目前为止没问题。

mockPPT.Object.AddSlides(1);

但这就是它偏离轨道的地方。您只是在模拟上调用该方法,与您在上面设置的相同。 Object 属性是一个虚拟对象,它只能执行它被设置要执行的操作并且与您的实际实现无关!

mockPPT.VerifyAll();

现在您验证了您调用了所有可验证的方法。您在此测试中所做的只是验证 Moq 是否有效;您的代码从未被触及。

现在让我们看看第二个示例中更改后的代码:

ExportPowerPoint temp = (ExportPowerPoint)mockPPT.Object;
temp.AddSlides(1);

该转换永远不会起作用。 Object 属性只是一些代理(实际上是动态类型),由对接口(interface)的任何具体实现一无所知的 Moq 生成这是 mock 。

关于c# - 使用 Moq 验证是否已调用 void 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35703723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com