繁体   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