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

Moq验证失败:期望Mock调用至少一次却未执行问题求助

解决Moq验证失败:Mock方法未被调用的问题

你遇到的这个Moq异常,核心原因其实很直白:你的Publisher类根本没调用注入的MyPublisher实例的GetMessageCount方法,所以你在测试里设置的Mock验证自然找不到对应的调用记录。

咱们一步步拆解问题:

1. 异常背后的真相

异常提示Expected invocation on the mock at least once, but was never performed,意思是你要求Mock的GetMessageCount必须被调用至少一次,但实际运行时根本没触发这个方法。

看一下你的Publisher类实现:

public long GetMessageCount(string msg)
{
    long result = 0;
    try
    {
        if (msg == "abc") throw new Exception();
        return result;
    }
    catch (Exception ex)
    {
        var p = ex.Message;
        return result = -1;
    }
}

这段代码全程都是自己处理逻辑——判断msg是"abc"就抛异常,然后返回-1,完全没用到构造函数里注入的MyPublisher私有字段。你的Mock对象就像个摆设,根本没被调用,Moq当然会报错。

2. 修正Publisher类的实现

你的Publisher应该是一个依赖委托类,它的职责应该是调用注入的IPublisher实例的方法,然后处理异常或添加额外逻辑,而不是自己实现核心逻辑。修正后的代码应该是这样:

public class Publisher : IPublisher
{
    private IPublisher MyPublisher { get; set; }

    public Publisher(IPublisher publisher)
    {
        MyPublisher = publisher;
    }

    public long GetMessageCount(string msg)
    {
        try
        {
            // 核心逻辑委托给注入的MyPublisher
            return MyPublisher.GetMessageCount(msg);
        }
        catch (Exception ex)
        {
            var p = ex.Message;
            return -1;
        }
    }
}

3. 调整测试代码匹配业务逻辑

现在Publisher会真正调用Mock的方法了,你需要调整测试来模拟业务场景:当传入"abc"时,Mock的GetMessageCount抛出异常,然后验证Publisher返回-1,同时验证Mock方法确实被调用了。

修正后的测试代码:

[TestMethod]
public void ShouldReturnNegativeWhenMsgIsInvalid1()
{
    string msg = "abc";
    
    // 模拟:当传入"abc"时,Mock的方法抛出异常
    myPublisherMock.Setup(m => m.GetMessageCount(msg)).Throws(new Exception());
    
    // 调用被测试方法
    long result = publisher.GetMessageCount(msg);
    
    // 验证返回值是否符合预期
    Assert.AreEqual(-1, result);
    // 验证Mock的方法确实被调用了一次
    myPublisherMock.Verify(m => m.GetMessageCount(msg), Times.Once);
}

总结

你之前的问题完全是因为Publisher类没有正确使用依赖注入的实例,导致Mock对象从未被触发。修正依赖调用逻辑后,测试就能正常验证了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:23:33