我想使用 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()
函数。我是单元测试的初学者。有人可以帮我吗?.
您可以使用测试容器,它可以处理 SQL/HTTP 请求。
它背后使用 Docker,你也可以在 CI/CD 上使用。