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

测试SqlException捕获逻辑时抛出SQL连接错误,求排查方法

问题根源

你现在靠「实际连接无效数据库」来生成SqlException,这种做法会在测试时真的触发数据库连接错误,而且这个异常没被MakeSqlException里的catch块兜住,直接扩散到测试方法里导致失败。另外这种方式依赖运行环境,完全没必要。

解决办法

别碰真实数据库,用反射直接构造SqlException实例就行,把你的MakeSqlException方法替换成以下代码:

public static SqlException MakeSqlException()
{
    var errorCollection = new SqlErrorCollection();
    errorCollection.Add(new SqlError(1, 1, 1, "localhost", "测试用SqlException", "test", 1));

    // 调用SqlException的私有构造函数
    var constructor = typeof(SqlException).GetConstructor(
        BindingFlags.NonPublic | BindingFlags.Instance,
        null,
        new[] { typeof(string), typeof(SqlErrorCollection), typeof(Exception), typeof(Guid) },
        null);

    return (SqlException)constructor.Invoke(new object[] { "测试异常", errorCollection, null, Guid.NewGuid() });
}

同时你测试代码里的Mock存在语法错误:异步方法抛出异常要使用ThrowsAsync而非Throws,修正后的Setup代码如下:

_context.Setup(x => x.CallSubOrchestratorAsync())
        .ThrowsAsync(MakeSqlException());
补充提醒
  • 异步方法的Mock必须用ThrowsAsync,否则异步逻辑处理异常时会出现异常传播问题。
  • 反射构造异常的方式不依赖外部环境,单元测试的执行效率和稳定性会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:06:21