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

如何使用Mock初始化IDbConnection和IConfiguration解决空参数异常

单元测试空参数报错解决方案

报错原因

你使用Moq创建的IConfiguration对象未配置GetSection方法的返回值,Moq对未配置的引用类型返回方法默认返回null。当调用configuration.GetSection("SigSettings")得到null后,后续对null对象调用Get<SigSettings>()扩展方法就会触发ArgumentNullException异常。

解决方法

方案1:使用内存配置实例(更推荐)

.NET配置系统原生支持内存配置提供程序,不需要Mock即可快速构造符合要求的IConfiguration对象,代码更简洁也更贴近真实运行逻辑:

private IConfiguration _configuration;
private Mock<IDbConnection> _connection = new Mock<IDbConnection>();
private readonly SignalsHandler _handler;

public SignalsTest()
{
    // 构造内存配置对象
    _configuration = new ConfigurationBuilder()
        .AddInMemoryCollection(new Dictionary<string, string>
        {
            // 可按需填写SigSettings对应的配置键值对,无特殊需求留空也可保证GetSection返回非空对象
            {"SigSettings:YourPropertyName", "TestValue"}
        })
        .Build();

    _handler = new SignalsHandler(_configuration, _connection.Object);
}

如果不需要自定义配置值,仅需要保证GetSection返回非空,不添加任何键值对也可正常运行。

方案2:Mock IConfiguration及IConfigurationSection

如果你必须使用Mock对象完成测试,可以通过手动配置GetSection的返回值解决:

private Mock<IConfiguration> _configuration = new Mock<IConfiguration>();
private Mock<IConfigurationSection> _sigSettingsSection = new Mock<IConfigurationSection>();
private Mock<IDbConnection> _connection = new Mock<IDbConnection>();
private readonly SignalsHandler _handler;

public SignalsTest()
{
    // 配置GetSection方法返回模拟的非空配置节点
    _configuration.Setup(c => c.GetSection("SigSettings")).Returns(_sigSettingsSection.Object);
    
    // 按需配置返回的SigSettings实例,无特殊需求可不加这行
    _sigSettingsSection.Setup(s => s.Get<SigSettings>()).Returns(new SigSettings());

    _handler = new SignalsHandler(_configuration.Object, _connection.Object);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:54:06