【发布时间】:2019-03-16 21:17:13
【问题描述】:
我正在尝试对返回 IActionResult 但在某些情况下也可能引发异常的控制器进行单元测试。我遇到的问题是我不确定如何调用它,因为 Assert 会引发错误,您无法将 IActionResult 转换为 Action。
我将如何测试以下语句?
Assert.Throws<Exception>(await controller.SendEmail(email)); //how to test this
我查看了 Microsoft 测试控制器文档,但没有找到相关内容。我看到的大多数测试异常示例都是针对访问存储库或服务之类的。
我知道我可以返回错误请求或重定向到带有错误消息的页面。但我想要完成的事情可能吗?
我的 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 测试
[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
}
【问题讨论】:
标签: asp.net asp.net-mvc xunit