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

时间:2009-03-04 10:06:38

标签: asp.net-mvc unit-testing

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

现在我在UnitTest中调用Action

    NiceController niceController = new NiceController();
    ActionResult result = niceController.WhateverAction();

有没有办法让ActionFilter调用?

2 个答案:

答案 0 :(得分:8)

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

但我认为你真正要说的是你想要测试WhateverAction,除非ActionFilter已经执行,否则该行动无效。

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

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

答案 1 :(得分:0)

  

编写一个单独的单元测试,证明该操作使用正确的属性

进行修饰

以下是编写此类单元测试的方法

Type t = typeof(MyController);
Assert.IsTrue(t.GetCustomAttributes(typeof(MyCustomAttribute)).Length > 0);