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

如何为C#中Mock的所有方法设置默认抛出异常?

解决方案

首先明确:你之前的写法错误在于把Exception对象作为返回值返回,但异步方法需要的是在调用时抛出异常,而非返回异常实例。针对Moq框架,正确实现所有Mock方法抛出异常的方式如下:

方法1:适配异步/同步方法的通用写法

// 先让所有方法都纳入Setup范围
_OSM.SetupAllMethods();

// 设置默认回调,触发时抛出自定义异常
_OSM.DefaultCallback = invocation =>
{
    var customException = new Exception(MyException);
    
    // 处理异步方法(返回Task或Task<T>)
    if (typeof(Task).IsAssignableFrom(invocation.Method.ReturnType))
    {
        if (invocation.Method.ReturnType.IsGenericType)
        {
            // 针对Task<T>类型,创建带异常的泛型Task
            var taskGenericType = invocation.Method.ReturnType.GetGenericArguments()[0];
            return typeof(Task)
                .GetMethod(nameof(Task.FromException))!
                .MakeGenericMethod(taskGenericType)
                .Invoke(null, new object[] { customException })!;
        }
        // 针对非泛型Task
        return Task.FromException(customException);
    }
    
    // 处理同步方法,直接抛出异常
    throw customException;
};

方法2:异步方法简化写法(Moq 4.16+)

如果你的Mock对象只有异步方法,可以用更简洁的方式:

_OSM.SetupAllMethods();
_OSM.SetReturnsDefault(() => throw new Exception(MyException));

这里的关键是用lambda表达式抛出异常,而非返回Exception对象。Moq会自动处理异步方法的Task包装,确保调用时抛出异常。

之前写法失败的原因

  • _OSM.SetReturnsDefault(new Exception(MyException)):方法返回的是Task/Task,但你传入的是Exception类型,类型不匹配,Moq拒绝设置,返回false。
  • _OSM.SetReturnsDefault(Task.FromResult(new Exception(MyException))):这会让方法返回一个包含Exception对象的Task,而非抛出异常,调用者会拿到这个Task的结果(Exception实例),不会触发异常捕获逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:25:19