gpt4 book ai didi

c# - 单元测试以捕获 Controller 方法中的异常

转载 作者:行者123 更新时间:2023-11-30 22:56:22 25 4
gpt4 key购买 nike

我正在尝试学习 xUnit 中针对 ASP.NET Core 项目的单元测试。为了实现它,我创建了一个简单的 ASP.NET Core 项目来对其进行测试。但是,由于错误地测试了在 Controller 方法中捕获的异常,我无法获得 100% 的测试覆盖率。

这是我正在测试的 Controller 方法:

        [HttpGet]
public async Task<IEnumerable<User>> GetUsers()
{
try
{
var users = await _repository.User.GetAllUsersAsync();
return users;
}
catch (Exception e)
{
_logger.LogError($"Error in GetUsers: {e}");
return null;
}
}

这是我在 xUnit 中的单元测试方法:

        [Fact]
public async Task GetUsers_WhenCalled_ReturnsCorrectAmountOfUsers()
{
//Arrange
var mockRepo = new Mock<IRepositoryWrapper>();
mockRepo.Setup(repo => repo.User.GetAllUsersAsync())
.ReturnsAsync(GetTestUsers());
var controller = new UsersController(mockRepo.Object, _logger, _service);

//Act
var result = await controller.GetUsers();

//Assert
var model = Assert.IsAssignableFrom<IEnumerable<User>>(result);
model.Count().Should().Be(3);
Assert.Throws<NullReferenceException>(() =>
_controller.GetUsers().Exception);
}

当我运行测试时,所有内容都变为绿色状态,但是在 Controller 类中,我看不到带有 catch block 范围的行旁边的“绿色勾号”。我真的很想知道如何编写正确的代码来测试 catch block 中的异常!

最佳答案

需要另一个测试,在执行时会导致抛出异常。

例如

[Fact]
public async Task GetUsers_WhenCalled_HandlesException() {
//Arrange
var mockRepo = new Mock<IRepositoryWrapper>();
mockRepo
.Setup(repo => repo.User.GetAllUsersAsync())
.ThrowsAsync(new InvalidOperationException());

var controller = new UsersController(mockRepo.Object, _logger, _service);

//Act
var result = await controller.GetUsers();

//Assert
Assert.IsNull(result);
//Can also assert what logger records
}

在上面的示例中,当 GetAllUsersAsync 被调用时,它会抛出一个异常,该异常将在 try-catch 中捕获并允许代码按测试预期的方式流动。

关于c# - 单元测试以捕获 Controller 方法中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54503317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com