首页 > 解决方案 > 如何使用 Mock 初始化我的 IDbConnection 和 IConfiguration

问题描述

我正在徘徊如何做到这一点,因为它给了我nullreferenceexception。我的处理程序类上有这个构造函数:

        IDbConnection _dbConnection;
        Context _context;
        SigSettings _settings;
        public SignalsHandler(IConfiguration configuration, IDbConnection connection)
        {
            _dbConnection = connection;
            _settings = configuration.GetSection("SigSettings").Get<SigSettings>();
            if (_settings == null)
                _settings = new SigSettings();
        }

我想对这个类进行单元测试来测试我的 crud 方法,但下面的代码不起作用:

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

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

它给了我这个错误: System.ArgumentNullException: 'Value cannot be null。此行上的 Arg_ParamName_Name':_settings = configuration.GetSection("SigSettings").Get();

有什么帮助吗?

标签: c#unit-testing

解决方案


_configuration只是模拟对象,您还需要设置它具有的方法,否则它们将返回null,因此configuration.GetSection("SigSettings")将返回null

为避免这种情况,您需要编写:

_configuration
   .Setup(x => x.GetSection("SigSettings"))
   .Returns("some setting");

或更一般地说:

_configuration
   .Setup(x => x.GetSection(It.IsAny<string>()))
   .Returns("some setting");

更新

由于我没有意识到方法返回一些对象而不是string,这里是完整的设置。通常,您总是为所有方法调用提供模拟,因此您将无处可去null

var configSectionMock = new Mock<IConfigurationSection>();
var configMock = new Mock<IConfiguration>();
configMock
    .Setup(x => x.GetSection(It.IsAny<string>()))
    .Returns(configSectionMock.Object);

// Instantiate system under test with mocked object.
var sut = new Sut(configMock.Object);

推荐阅读