如何为 ExecuteSqlRawAsync 编写单元测试用例

问题描述 投票:0回答:1

我想使用 Nunit 和 moq 为以下方法编写一个单元测试用例。该方法有一个

ExecuteSqlRawAsync
将数据从一个表插入到另一个表。如果出现任何异常,我将回滚事务。在我的单元测试用例中,我希望以某种方式模拟
DbContext.Database.ExecuteSqlRawAsync()
函数。

public async Task<bool> InsertxxyyyFromStagingDataAsync(CancellationToken cancellationToken)
{
    try
    {
        using (var transaction = _connectionFactory.CreateConnection().BeginTransaction())
        {
            try
            {
                await _dbContext.Database.ExecuteSqlRawAsync($"INSERT INTO xxxxx SELECT * FROM STAGING_xxxx", cancellationToken);
                await _dbContext.Database.ExecuteSqlRawAsync($"INSERT INTO yyyyy SELECT * FROM STAGING_yyyy", cancellationToken);

                return true;
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                return false;
            }
        }
    }
    catch (Exception ex)
    {
        return false;
    }

}

对于上述方法,我尝试了以下测试并在单元测试用例中出现异常。

System.NotSupportedExceptionUnsupported
表情....
ExecuteSqlRawAsync(It.IsAny<string>(), It.IsAny<CancellationToken>())
扩展方法(此处:
RelationalDatabaseFacadeExtensions.ExecuteSqlRawAsync
)不得在设置/验证表达式中使用。

[Test]
public async Task InsertDataFromStagingDataAsync_Error()
{
    var options = new DbContextOptionsBuilder<MYDBContext>().UseInMemoryDatabase(databaseName: "InMemoryDb")
                                           .ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning))
                                           .Options;

    var connectionFactory = new Mock<IDbConnectionFactory>();
    var connectionMock = new Mock<IDbConnection>();

    var dbContextMock = new Mock<MYDBContext>();

    // Set up expectations for ExecuteSqlRawAsync
    dbContextMock.Setup(db => db.Database.ExecuteSqlRawAsync(It.IsAny<string>(), It.IsAny<CancellationToken>()))
        .ReturnsAsync(1); // Assuming 1 row affected for successful insert

    var repositoryObj = new Repository(_mockHttpClientFactory.Object, _mockAppContainerOption.Object, dbContextMock.Object, logger.Object, null, connectionFactory.Object);

    var result = repositoryObj.InsertxxyyFromStagingDataAsync(new CancellationToken());
    // Assert
    Assert.IsNotNull(result);

}

这就是我启动单元测试用例的方式,该用例执行失败。在我的单元测试用例中,我希望以某种方式模拟

DbContext.Database.ExecuteSqlRawAsync()
函数。我是单元测试的初学者。有人可以帮我吗?.

c# .net asp.net-core nunit moq
1个回答
0
投票

您可以使用测试容器,它可以处理 SQL/HTTP 请求。

它背后使用 Docker,你也可以在 CI/CD 上使用。

© www.soinside.com 2019 - 2024. All rights reserved.