Модульные тесты для обнаружения исключений в методе контроллера - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь научиться модульному тестированию в 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 голосов
/ 03 февраля 2019

Требуется еще один тест, который вызовет исключение при выполнении.

Например,

[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, и позволить потоку кода выполнить, как предназначено для теста.

...