如何在 MVC 中对专用控制器方法进行单元测试 ASP.NET

本文关键字:方法 单元测试 NET ASP 控制器 专用 MVC | 更新日期: 2023-09-27 17:56:41

MVC 中对控制器内部的私有方法进行单元测试的最佳实践是什么 ASP.NET?目前,如果我想在控制器内对私有方法进行单元测试,我必须将其设置为公共方法,但是当我这样做时,该方法会暴露给 Web。

将方法

移动到帮助程序类的最佳方法是什么?

如何在 MVC 中对专用控制器方法进行单元测试 ASP.NET

应将该方法移动到将接口提取到的帮助程序类中。这样,可以更轻松地执行依赖注入并切换底层实现或在需要时模拟它。
测试私有方法是代码异味(或测试异味)。
仅在必要时使用 InternalsVisibleTo 技巧(即您正在使用不可测试的类并且必须引发一个由受保护的函数调用对您隐藏的事件)。

你应该使用私有对象,如下所示:

var privateObject = new PrivateObject(this.controller);
var result = (ActionResult)privateObject.Invoke("RegisterToEvent", shippingAddressID, creditCardID);  

可以将该方法设置为内部而不是私有,然后将 InternalsVisibleTo 属性设置为测试程序集的名称。

在程序集信息中:

[assembly: InternalsVisibleTo("MyTestAssembly")]

您可以像这样为测试方法创建一个操作筛选器。

public class TestActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         filterContext.HttpContext.Response.Redirect("loginurl");
         //or throw exception or some other action
    }
}

或者,也可以使该方法仅供另一个程序集公开访问。

[assembly: InternalsVisibleTo("TestAssembly")]

您可以通过将测试限制为可见方法来解决此问题。任何私有方法都将至少由一个可见方法使用(否则:可以安全地删除它)。

因此,我建议开发调用具有实用价值的可见方法的测试,以便测试私有算法。如果无法通过可见方法访问代码 - 将其删除。

我使用了 PrivateObject() 方法,但我也喜欢 Charlino 对 NonActionAttribute 的建议(请参阅上面对原始问题的评论)。