如何在ASP.NET MVC中对ActionFilter进行单元测试?

Mat*_*s F 6 asp.net-mvc unit-testing

ActionFilter我的控制器级有一个.OnActionExecuting在Web应用程序中调用控制器的操作时,将调用该方法.

现在我Action在一个UnitTest中调用:

    NiceController niceController = new NiceController();
    ActionResult result = niceController.WhateverAction();
Run Code Online (Sandbox Code Playgroud)

有没有办法让ActionFilter调用?

Cra*_*ntz 8

为了自动调用ActionFilter,您将需要运行控制器动作调用程序.这是可能的,但这意味着MVC框架将尝试并执行结果.这意味着您必须使用模拟来删除结果的执行.同样,这是可能的,但这意味着您的单元测试变得比实际代码更多.直接测试滤波器可能更正确.毕竟,OnActionExecuting被调用的事实是框架的一个特性,您不需要对框架本身进行单元测试.

但我认为你真正要说的是你要测试WhateverAction,除非ActionFilter已执行,否则该操作无效.

首先,我会问这个设计的问题.它是否正确?有可能.例如,具有Authorize属性的操作可以假设在执行时有一个登录用户是合理的.当然,行动应该对此进行测试,但这种假设是安全的.另一方面,操作可能不需要过滤器来执行特定于操作的初始化.所以你应该问这个问题,但答案很清楚,设计是正确的.

在这种情况下,单元测试的最佳决策可能是在单元测试中手动执行过滤器,并编写单独的单元测试,证明操作使用正确的属性进行修饰.