单元测试运行报错:MongoDB连接字符串为null引发ArgumentNullException
异常原因排查
你当前贴出的测试代码里已经Mock了IDataService,理论上不会触发真实MongoDB调用,仍然抛出连接字符串空异常,说明你测试逻辑中没有使用你创建的Mock对象,而是实例化了真实的IDataService实现类,真实实现读取配置时获取不到连接串,触发报错。
针对配置读取问题的解决方法:
- 检查测试项目中
appsettings.json的文件属性,右键文件→属性→将复制到输出目录设置为如果较新则复制,避免生成时配置文件不被输出到运行目录。 - .NET测试项目默认不会自动加载
appsettings.json,需要手动构建配置对象,示例代码如下:
IConfiguration config = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build();
- 注册Mongo相关服务或者初始化MongoClient时,要从上面构建的
config对象中读取连接串,不要使用默认空配置。
现有测试代码逻辑错误
你当前编写的测试代码本身存在两处问题,即使解决了配置异常也无法通过测试:
mock.Setup()的返回值是ISetup类型,不是GetPortfolio方法的执行结果。你需要先完成Mock配置,再调用Mock实例的对应方法获取返回值,修改后的代码如下:
// 配置Mock规则 mock.Setup(p => p.GetPortfolio("61377666d24fd78398a5a558")).ReturnsAsync(nn); // 调用Mock实例方法获取结果 var result = await mock.Object.GetPortfolio("61377666d24fd78398a5a558");
- 你使用默认
Equals方法对比两个PortfolioData引用类型对象,默认逻辑是对比内存地址,就算两个对象所有属性值完全一致也会返回false。你可以选择重写PortfolioData的Equals方法,或者逐个对比对象属性完成断言。
内容的提问来源于stack exchange,提问作者moris62
相关产品推荐
相关产品推荐

