You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Moq验证方法调用?SetFirefoxOptions调用验证失败排查

解决Moq验证SetFirefoxOptions未被调用的问题

你的测试代码里有两个关键问题导致Moq提示SetFirefoxOptions未被调用,咱们一步步拆解:

问题1:没有触发目标方法的执行

你的测试里只做了Mock的Setup和Verify,但从来没有实际调用GetFirefoxDriver方法。如果连方法都没执行,内部的SetFirefoxOptions调用自然不会发生。

问题2:Setup替换了GetFirefoxDriver的原始实现

你用mockManager.Setup(m => m.GetFirefoxDriver(stubCapabilities)).Returns(It.IsAny<IWebDriver>())给GetFirefoxDriver设置了返回值,这会让Moq完全替换掉这个方法的原始逻辑——也就是说,当你调用这个Mock对象的GetFirefoxDriver时,它不会执行你在DriverManager类里写的var browserOptions = SetFirefoxOptions(sauceCaps);这段代码,而是直接返回你指定的IWebDriver实例,这就跳过了SetFirefoxOptions的调用。

修正后的测试代码

要验证真实的方法逻辑(GetFirefoxDriver确实调用了SetFirefoxOptions),我们需要让Moq在未被Setup的方法上调用基类的真实实现,同时确保实际触发方法调用:

[TestMethod]
public void ShouldSetFirefoxOptions() {
    // 创建SauceCaps的Stub
    var stubCapabilities = new Mock<SauceCaps>().Object;
    
    // 创建DriverManager的Mock,启用CallBase让未Setup的方法调用真实实现
    var mockManager = new Mock<DriverManager>() { CallBase = true };

    // 关键:实际调用要测试的GetFirefoxDriver方法
    mockManager.Object.GetFirefoxDriver(stubCapabilities);

    // 验证SetFirefoxOptions被调用了一次
    mockManager.Verify(m => m.SetFirefoxOptions(stubCapabilities), Times.Once);
}

额外说明

  • 你的SetFirefoxOptions和GetFirefoxDriver都标记为virtual,这是正确的——Moq只能拦截虚方法或接口方法。
  • 如果需要自定义SetFirefoxOptions的返回值(比如不想用真实的FirefoxOptions实例),可以单独Setup这个方法:
    mockManager.Setup(m => m.SetFirefoxOptions(stubCapabilities))
               .Returns(new FirefoxOptions { BrowserVersion = "115", PlatformName = "Windows 10" });
    

内容的提问来源于stack exchange,提问作者Nikolay Advolodkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:40:10