代码之家  ›  专栏  ›  技术社区  ›  Mathias F

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

  •  7
  • Mathias F  · 技术社区  · 15 年前

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

    现在我打电话给 Action 在单元测试中:

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

    是否有方法调用ActionFilter?

    2 回复  |  直到 13 年前
        1
  •  9
  •   Craig Stuntz    15 年前

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

    但我认为您真正要说的是,您想要测试什么是准确性,并且除非actionfilter已经执行,否则该操作无法工作。

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

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

        2
  •  0
  •   Marco M.    15 年前

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

    下面是如何编写这样的单元测试

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