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

时间:2011-05-18 12:05:14

标签: c# asp.net-mvc unit-testing

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

将方法移动到辅助类的最佳方法是什么?

6 个答案:

答案 0 :(得分:2)

您应该将方法移动到解压缩接口的辅助类中。这样就可以更容易地执行依赖注入并切换底层实现或在需要时模拟它 测试私有方法是代码气味(或测试气味) 只有在你必须使用时才使用InternalsVisibleTo技巧(即你使用的是一个untestable类,并且必须引发一个受保护函数调用隐藏的事件)。

答案 1 :(得分:1)

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

在汇编信息中:

[assembly: InternalsVisibleTo("MyTestAssembly")]

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

你可以为这样的测试方法创建一个动作过滤器....

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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