如何使用 Dapper.Contrib 在 .NET Core 中使用 xUnit 编写测试?
How to write a test with xUnit in .NET Core using Dapper.Contrib?
我在 Asp.Net Core Web API 项目中使用了 Dapper.Contrib。
我在这个项目中用 xUnit 编写测试时遇到了问题。
例如,这是我将记录添加到数据层的方法。
public async Task<bool> AddAsync(User entity)
{
await using var connection = _dbConnection.CreateDbConnection();
await connection.OpenAsync();
return await connection.InsertAsync(entity) > 0;
}
我按照这个方法尝试写的xUnit方法如下
[Fact]
public void AddAsync_Should_Return_As_Expected()
{
var connection = new Mock<DbConnection>();
//Arrange
_userDbConnection.Setup(u => u.CreateDbConnection()).Returns(connection.Object);
//Act
var result = _sut.AddAsync(_user).GetAwaiter().GetResult();
//Assert
//Assert.Equal(result,actual);
}
当我运行这个测试方法时,我得到对象未设置错误
'return await connection.InsertAsync(entity) > 0;'行。
到底是我的错?
我相信您正在使用模拟连接并尝试在其上调用 Dapper 方法 InsertAsync
。 Dapper方法难免失败,因为不是真正的连接
我不确定您在这里使用模拟有多少价值。在测试 AddAsync 时,您真正想知道的是,它是否确实执行了您希望它执行的操作,即向数据库中插入数据。因此,如果我是您,我会通过使用真实连接而不是模拟连接将此测试转变为集成测试。一种方法是
- 使用测试数据库进行测试
- 在 运行 测试之前从测试数据库中删除所有数据
- 在您的断言中,使用 Dapper 或其他方式检查实体查询是否带回您期望在数据库中的数据。
我不一定推荐这种方法,但另一种方法可能是使用内存数据库。例如参见 [=11=].
我在 Asp.Net Core Web API 项目中使用了 Dapper.Contrib。 我在这个项目中用 xUnit 编写测试时遇到了问题。 例如,这是我将记录添加到数据层的方法。
public async Task<bool> AddAsync(User entity)
{
await using var connection = _dbConnection.CreateDbConnection();
await connection.OpenAsync();
return await connection.InsertAsync(entity) > 0;
}
我按照这个方法尝试写的xUnit方法如下
[Fact]
public void AddAsync_Should_Return_As_Expected()
{
var connection = new Mock<DbConnection>();
//Arrange
_userDbConnection.Setup(u => u.CreateDbConnection()).Returns(connection.Object);
//Act
var result = _sut.AddAsync(_user).GetAwaiter().GetResult();
//Assert
//Assert.Equal(result,actual);
}
当我运行这个测试方法时,我得到对象未设置错误 'return await connection.InsertAsync(entity) > 0;'行。
到底是我的错?
我相信您正在使用模拟连接并尝试在其上调用 Dapper 方法 InsertAsync
。 Dapper方法难免失败,因为不是真正的连接
我不确定您在这里使用模拟有多少价值。在测试 AddAsync 时,您真正想知道的是,它是否确实执行了您希望它执行的操作,即向数据库中插入数据。因此,如果我是您,我会通过使用真实连接而不是模拟连接将此测试转变为集成测试。一种方法是
- 使用测试数据库进行测试
- 在 运行 测试之前从测试数据库中删除所有数据
- 在您的断言中,使用 Dapper 或其他方式检查实体查询是否带回您期望在数据库中的数据。
我不一定推荐这种方法,但另一种方法可能是使用内存数据库。例如参见 [=11=].