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

标签 c# unit-testing asp.net-core moq xunit

我正在尝试学习 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/

相关文章:

c# - Visual Studio 单元测试和命令行参数以避免源代码控制中的密码

c# - C# 文本框中的空值或 "0"

c# - 什么是 C# exclusive 或 `^` 用法?

javascript - 如何在 Angular/Karma 单元测试中忽略 run.js?

c# - 如何在 AspNetCore.Authentication.Abstractions 上模拟 AuthenticateAsync

c# - .Net Core 2 JWT,Angular 2 通过角色授权不起作用

unit-testing - 如何 reshape S3对象以使其具有可比性?

android - 如何在 Robolectric 单元测试中断言 void 方法

c# - 如何使用 ASP.NET MVC Core 初始设置角色和用户(如站点管理员)?

c# - 本地化在通过 QueryString 设置文化时起作用,但在文化在途中时不起作用