【问题标题】:How do I UnitTest a custom ActionFilter?如何对自定义 ActionFilter 进行单元测试?
【发布时间】:2009-06-01 15:20:35
【问题描述】:

我一直试图找到一些关于此的直接信息,但我一直未能找到 - 我发现的内容对于我理解正在发生的事情来说是模糊的,或者对于错误的事情来说太具体了,例如我找到的用于对 AuthorizeAttribute 进行单元测试的教程。 (第三种选择当然是我太笨了,没有意识到我正在阅读我正在寻找的信息......在这种情况下,我仍然需要帮助,因为我很笨:P)

我希望能够测试两件事:

  1. 将给定的 ActionFilter 应用于操作(以确保操作满足要求)
  2. 给定的 ActionFilter 做了它应该做的事情。

而且我一无所知。任何人都可以将我推向正确的方向,以了解我实际需要测试的内容吗?我的 Arrange、Act 和 Assert 部分的测试应该包含哪些内容?


一点细节,如果我不够清楚:

我有一个CustomValidationFilter,它应该检查两个提交的表单值是否相同,如果不是,则添加一个ModelStateError。如果值不同,我想验证错误是否添加了正确的错误消息,并且如果值 相等(并且非空)。

我还对GuestbookController 执行了Write 操作。我想验证过滤器是否应用于此操作。

【问题讨论】:

  • 你能发布你的工作代码吗?我已经创建了属性,但在传递 ResultExecutingContext 时遇到问题。
  • 嗨,马克!我的代码可在snipplr.com/users/RockinForGod

标签: asp.net-mvc unit-testing action-filter


【解决方案1】:

在测试中使用反射。

   var method = typeof(MyController).GetMethod("MyMethod");
   var attribute = method.GetCustomAttributes(typeof(CustomValidationFilter),false);
                         .Cast<CustomValidationFilter>()
                         .SingleOrDefault();

   Assert.IsNotNull( attribute );
   Assert.AreEqual( "value", atttribute.SomeProperty );

为您的类中的方法创建一个单元测试。使用适当的数据模拟 filterContext 并检查该方法应该设置的任何变量实际上是否符合您的预期。

 public void AttributeTest()
 {
     var httpContext = MockRepository.GenerateMock<HttpContextBase>();
     var controller = new FakeController();
     controller.controllerContext = new ControllerContext( httpContext, new RouteData(), controller );
     ...

     attribute.OnActionExecuting( filterContext );

     Assert...

 }

【讨论】:

  • 非常感谢!我花了一段时间才弄清楚如何模拟 AttributeTest 所需的一切,但我想我现在明白了。如果有人发现并感兴趣,我将在编辑中发布代码 - 只需在此处发表评论,我将使用我的测试代码更新问题。
  • @Tomas 我很想写一篇关于你到底做了什么的帖子,因为我只是想问一个问题。也就是说,您可以使用 MvcContrib.TestHelper 来协助模拟所需的数据吗?
  • @ahsteele:我已经有一段时间没有做这个了,但似乎我在snipplr.com/users/RockinForGod 添加了一个工作示例如果这对你来说还不够,你可以随时提出一个新问题详细说明您还有什么需要。
【解决方案2】:

这是一篇博客文章,介绍了如何扩展和单元测试自定义授权过滤器。该博客文章详细介绍了您的两个问题,即如何测试给定的 ActionFilter 是否应用于某个操作以及如何测试 ActionFilter 是否完成了它应该做的事情。

http://blog.geniar.com/index.php/2009/05/aspnet-mvc-testing-a-custom-authorize-filters/

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 2018-05-27
    • 2020-10-29
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多