测试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
相关产品推荐
相关产品推荐

