单元测试以捕获控制器方法中的异常

时间:2019-02-03 13:23:35

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

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

这是我正在测试的控制器方法:

        [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);
        }

运行测试时,所有内容都变为绿色状态,但是在控制器类内部,在具有catch块作用域的行旁边看不到“绿色勾号”。我真的很想知道如何编写适当的代码来测试catch块中的异常!

1 个答案:

答案 0 :(得分:0)

还需要另一项测试,该测试将导致在执行运动时引发异常。

例如

[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中捕获,并允许代码按预期的方式流动。