C# 如何使用Dapper.Contrib在.NET内核中使用xUnit编写测试?

C# 如何使用Dapper.Contrib在.NET内核中使用xUnit编写测试?,c#,unit-testing,.net-core,xunit,C#,Unit Testing,.net Core,Xunit,我在Asp.Net核心Web API项目中使用了Dapper.Contrib。 在这个项目中,我在使用xUnit编写测试时遇到了一个问题。 例如,下面是我向数据层添加记录的方法 public async Task<bool> AddAsync(User entity) { await using var connection = _dbConnection.CreateDbConnection(); await connection.OpenA

我在Asp.Net核心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;
   }
public async Task AddAsync(用户实体)
{
等待使用var connection=_dbConnection.CreateDbConnection();
等待连接。OpenAsync();
返回等待连接。InsertAsync(实体)>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);
}
[事实]
public void AddAsync_应_按预期返回_()
{
var connection=newmock();
//安排
_userDbConnection.Setup(u=>u.CreateDbConnection())。返回(connection.Object);
//表演
var result=_sut.AddAsync(_user.GetAwaiter().GetResult();
//断言
//断言。相等(结果,实际);
}
当我运行这个测试方法时,我在 '返回等待连接。插入同步(实体)>0;'线路


我的错误到底是什么?

我相信现在发生的是,您正在使用一个模拟连接,并试图调用一个简洁的方法,
InsertAsync
。简洁的方法不可避免地会失败,因为它不是真正的连接

我不确定在这里使用mock可以获得多少价值。在测试AddAsync时,您真正想知道的是,它是否真正执行了您希望它执行的操作,即向数据库中插入数据。因此,如果我是你,我会通过使用真实连接而不是模拟连接,将此测试转换为集成测试。一种方法是

  • 使用测试数据库进行测试
  • 在运行测试之前,请删除测试数据库中的所有数据
  • 在断言中,使用Dapper或其他方法检查实体的查询是否返回了您希望在数据库中的数据

  • 我不一定推荐这样做,但另一种方法可能是使用内存中的数据库。请参阅示例。

    错误很明显-您试图在仅配置了
    CreateDbConnection
    的模拟连接上使用
    InsertAsync
    。您也应该设置
    InsertAsync