繁体   English   中英

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

[英]How do I unit test private controller methods in ASP.NET MVC?

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

将方法移到助手类的最好方法是吗?

您应该将方法移到提取接口的帮助器类中。 这样,执行依赖注入和切换底层实现或在需要时对其进行模拟就变得更加容易。
测试私有方法是一种代码气味(或一种测试气味)。
仅在必要时才使用InternalsVisibleTo进行欺骗(即,您正在使用不可测试的类,并且必须引发受保护的函数调用对您隐藏的事件)。

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

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

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

在组装信息中:

[assembly: InternalsVisibleTo("MyTestAssembly")]

我已经使用了PrivateObject ()方法,但我喜欢NonActionAttribute的Charlino的建议(见注释上面原来的问题),太。

您可以为这种测试方法创建一个动作过滤器。

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")]

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM