繁体   English   中英

如何使用 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);
}

当我运行这个测试方法时,我得到 object not set error in 'return await connection.InsertAsync(entity) > 0;' 线。

我到底有什么错?

我相信正在发生的事情是您正在使用模拟连接并尝试在其上调用 Dapper 方法InsertAsync Dapper 方法不可避免地会失败,因为它不是真正的连接。

我不确定在这里使用模拟可以获得多少价值。 您真正想知道的是,在测试 AddAsync 时,它是否真的按照您希望的方式将数据插入数据库。 所以如果我是你,我会通过使用真实连接而不是模拟连接将这个测试变成集成测试。 一种方法是

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

我不一定推荐这个,但另一种方法可能是在 memory 数据库中使用。 参见例如单元测试 Dapper Repositories

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM