如何使用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
相关产品推荐
相关产品推荐

