【发布时间】:2021-10-27 19:21:06
【问题描述】:
我在测试 IDBconnection Mock 时遇到问题,因为它给了我一个空数据库。 请注意,对于我的 IConfiguration 而不是模拟,我创建了一个带有连接字符串的 appsettingstest.json 到用于测试目的的数据库。 但是对于 IDbConnection,我不知道如何传递 ConnectionString,因为这是我使用 Dapper 的第一个项目。
这是我的处理程序构造函数:
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();
}
这是我的测试类构造函数:
private Mock<IDbConnection> _connection = new Mock<IDbConnection>();
private readonly SignalsHandler _handler;
private readonly IConfiguration _configuration;
private readonly SigSettings _settings;
public SignalsTest()
{
_configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(@"appsettingstest.json", false, false)
.AddEnvironmentVariables()
.Build();
_connection.Setup(x => x.ConnectionString).Returns(path);
_settings = _configuration.GetSection("SigSettings").Get<SigSettings>();
if (_settings == null)
_settings = new SigSettings();
_handler = new SignalsHandler(_configuration, _connection.Object);
}
这可行,但是当我执行测试方法时,例如这个虚拟测试:
public void CanGetAllSignals()
{
_connection.Setup(x => x.ConnectionString);
var result = _handler.GetSignals();
Assert.IsNotNull(result);
}
它调用这个方法:
public async Task<List<SignalsDTO>> GetSignals()
{
var res = new List<SignalsDTO>();
var sigList = await _dbConnection.QueryAsync<SigSignal>(_settings.Signals);
foreach (var s in sigList)
res.Add(new SignalsDTO(){IDTag = s.IDTag, Name = s.Name});
return res;
}
这就是我遇到问题的地方,因为它在这一行给了我一个NullReferenceException: 'Object reference not set to an instance of an object':var sigList = await _dbConnection.QueryAsync<SigSignal>(_settings.Signals);,如果你查看_dbConnection,你可以看到它是一个模拟对象并且数据库为空,所以这就是失败。
我该如何解决这个问题?我试图模拟它,但也许这甚至不是最好的方法。
【问题讨论】:
标签: c# unit-testing mstest dapper