[英]How to unit test MVC controller that uses HttpContext in ASP.NET Core 1.1
[英]How to Unit Test a Catch Block within a ASP.Net Core MVC Controller?
如何对下面的 catch 块进行单元测试?
以下是我的控制器定义:
public class RunController : Controller
{
Public ActionResult GetExtraRun()
{
try{
return View("ExtraRun");
} catch(Exception ex)
{
_log.Error("Index -" + ex.Message, ex);
TempData[ErrorInfo] = GetErrorInfo(ex, "RunStatus");
return RedirectToAction("Index", "RunErrorHandling");
}
}
}
我在 Asp.NET Core MVC 3.0 版本中使用最新的 NUnit 和 Moq。
所以我将有两个测试用例如下
所以我需要上面给定代码中第二点的帮助。
为了测试所需的代码块,您需要在以下情况下使控制器抛出异常
return View("ExtraRun");
被调用。
这可以通过virtual
控制器并覆盖View(string)
函数来完成,该函数是virtual
[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.ViewResult View (string viewName);
以下示例使用 MOQ 来模拟控制器并覆盖预期功能,以便控制器在执行测试时按预期运行。
//Arrange
//...
var mock = new Mock<RunController>({inject dependencies here});
mock.CallBase = true;
var exception = new Exception("Sample message");
mock.Setup(_ => _.View(It.IsAny<string>())).Throws(exception);
RunController controller = mock.Object;
//Act
var actual = controller.GetExtraRun() as RedirectToActionResult;
//Assert
actual.Should().NotBeNull(); //FluentAssertions
//...perform desired assertions here
通常,在单元测试时不会模拟被测对象。 然而,这种情况需要调用需要配置为按需要运行的主题内的成员。 这可以通过在派生类中覆盖它来完成。 如果没有模拟框架,也可以手动完成相同的操作,但该框架简化了设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.