【问题标题】:How to write a test with xUnit in .NET Core using Dapper.Contrib?如何使用 Dapper.Contrib 在 .NET Core 中使用 xUnit 编写测试?
【发布时间】:2020-06-24 21:34:38
【问题描述】:

我在我的 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 错误 '返回等待连接。InsertAsync(entity) > 0;'行。

究竟是我的错?

【问题讨论】:

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

标签: c# unit-testing .net-core xunit


【解决方案1】:

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

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

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

我不一定推荐这样做,但另一种方法可能是使用内存数据库。参见例如unit testing Dapper Repositories

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2018-08-08
    • 1970-01-01
    • 2017-08-24
    • 2017-10-31
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多