Asp.net core 2 XUnit - контроллер MVC модульного тестирования, выдающий исключение - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь выполнить модульное тестирование контроллера, который возвращает IActionResult, но может также вызвать исключение при определенных обстоятельствах.Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как ее вызвать, так как Assert выдает ошибку, когда вы не можете преобразовать IActionResult в Action.

Как мне провести тестирование нижеприведенного заявления?

 Assert.Throws<Exception>(await controller.SendEmail(email)); //how to test this

Я просмотрел документацию по контроллеру тестирования Microsoft и не нашел ничего подходящего.Большинство примеров, которые я вижу, тестируют исключения для таких вещей, как доступ к репозиториям или сервисам.

Я понимаю, что могу вернуть плохой запрос или перенаправить на страницу с сообщением об ошибке.Но возможно ли то, что я пытаюсь достичь?

Метод My HomeController

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> SendEmail(EmailModel emailModel)
        {
            if(!ModelState.IsValid)
            {
                return View("Index",emailModel);
            }

            var response = await _sendEmail.SendEmailMessage(emailModel);

            if (response != System.Net.HttpStatusCode.Accepted)
            {
                throw new Exception("Email failed to send, please try again later");
            }
            else
            {
                TempData["message"] = $"Email has been sent";
            }

            return RedirectToAction("Index");
        }

XUnit Конструктор HomeControllerTest для аранжировки

        private Mock<ISendEmail> mockSendEmail;
        private HomeController controller;

        public HomeControllerShould()
        {
            mockSendEmail = new Mock<ISendEmail>();
            mockSendEmail.Setup(x => x.SendEmailMessage(It.IsAny<EmailModel>())).ReturnsAsync(HttpStatusCode.Accepted);
            controller = new HomeController(mockSendEmail.Object);
        }

XUnit Test дляОтправка электронной почты

 [Fact]
    public async Task SendEmailActionThrowsExceptionOnEmailFailure()
    {
        mockSendEmail.Setup(x => x.SendEmailMessage(It.IsAny<EmailModel>())).ReturnsAsync(HttpStatusCode.InternalServerError);
        var email = new EmailModel();

        Assert.Throws<Exception>(await controller.SendEmail(email)); //how to test this
    }

1 Ответ

0 голосов
/ 12 октября 2018

Assert.Throws требует функции.Вы можете использовать ThrowsAsync.

[Fact]
public async Task SendEmailActionThrowsExceptionOnEmailFailure()
{
    mockSendEmail.Setup(x => x.SendEmailMessage(It.IsAny<EmailModel>()))
        .ReturnsAsync(HttpStatusCode.InternalServerError);

    var email = new EmailModel();

     await Assert.ThrowsAsync<Exception>(() => controller.SendEmail(email)); 
}

. К вашему сведению: Обычно мы не возвращаем HttpStatusCode со слоя обслуживания, такого как служба электронной почты, но я дам вам решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...