【问题标题】:How do I unit test an ActionFilter in ASP.NET MVC?如何在 ASP.NET MVC 中对 ActionFilter 进行单元测试?
【发布时间】:2009-03-04 10:06:37
【问题描述】:

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

现在我在 UnitTest 中调用 Action

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

有没有办法调用 ActionFilter?

【问题讨论】:

    标签: asp.net-mvc unit-testing


    【解决方案1】:

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

    但我认为你真正想说的是你想要测试 WhatAction,除非 ActionFilter 已执行,否则该操作无法工作。

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

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

    【讨论】:

    【解决方案2】:

    编写一个单独的单元测试来证明该动作被正确的属性修饰

    这是编写这样一个单元测试的方法

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

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 2010-10-22
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多