簡體   English   中英

如何在 ASP.Net Core MVC 控制器中對 Catch 塊進行單元測試?

[英]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。

所以我將有兩個測試用例如下

  1. ) 檢查它是否成功返回視圖。
  2. ) 我需要檢查 catch 塊作為代碼覆蓋的一部分。

所以我需要上面給定代碼中第二點的幫助。

為了測試所需的代碼塊,您需要在以下情況下使控制器拋出異常

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM