Я пытаюсь выполнить модульное тестирование контроллера, который возвращает 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
}