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

Moq.Object创建实例单元测试失败:Mock预设返回值未生效问题

问题原因与修复方案

根因分析

你当前的代码逻辑存在两处核心问题:

  • 构造函数中注入的IMyClass实例没有被存储为类成员,后续业务逻辑完全没有用到该Mock实例
  • DoSomething方法调用的是MyClass类自身实现的MyMethod方法,该方法固定返回false,和你预设的Mock返回值没有任何关联

修复方案

根据你的业务设计意图,有两种常见修复路径:

路径1:保持装饰器模式设计

如果你的MyClass是装饰器实现,需要依赖注入另一个IMyClass实例做能力增强,修改MyClass代码如下:

public class MyClass : IMyClass
{
    // 新增私有成员存储注入的依赖
    private readonly IMyClass _innerMyClass;

    public MyClass(IMyClass innerMyClass)
    {
        _innerMyClass = innerMyClass;
    }

    public bool MyMethod()
    {
        // 调用注入实例的方法
        return _innerMyClass.MyMethod();
    }

    public string DoSomething()
    {
        if(MyMethod() == false)
        {
            return "did something";
        }
        else
        {
            return "did something else";
        }
    }
}

原有测试代码不需要修改,运行即可符合预期。

路径2:仅Mock当前类的方法

如果你的设计不需要额外注入IMyClass依赖,只是想MockMyClass自身的MyMethod方法做单元测试,做两处修改:

  1. 修改MyClass的MyMethod为虚方法:
public virtual bool MyMethod()
{
    return false;
}
  1. 调整测试代码,直接MockMyClass类型:
[TestMethod]
public void MyMethodTest()
{
    var moq = new Mock<MyClass>();
    moq.Setup(m => m.MyMethod()).Returns(true);

    var sut = moq.Object;
    Assert.AreEqual(sut.DoSomething(), "did something else");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:36:03