![](/img/trans.png)
[英]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.