如何使用 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 时,您真正想知道的是,它是否确实执行了您希望它执行的操作,即向数据库中插入数据。因此,如果我是您,我会通过使用真实连接而不是模拟连接将此测试转变为集成测试。一种方法是

  1. 使用测试数据库进行测试
  2. 在 运行 测试之前从测试数据库中删除所有数据
  3. 在您的断言中,使用 Dapper 或其他方式检查实体查询是否带回您期望在数据库中的数据。

我不一定推荐这种方法,但另一种方法可能是使用内存数据库。例如参见 [​​=11=].