我如何UnitTest自定义ActionFilter?

时间:2009-06-01 15:20:36

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

我一直试图找到一些关于此的直截了当的信息,但我无法 - 或者我发现的任何一件事都模糊不清我理解发生了什么,或者对于错误的事情过于具体,例如我发现用于单元测试AuthorizeAttribute的教程。 (第三种选择当然是我太笨了,没有意识到我正在阅读我正在寻找的信息......在这种情况下我仍然需要帮助,因为我很笨:P)

我希望能够测试两件事:

  1. 将给定的ActionFilter应用于某个操作(以确保该操作符合要求)
  2. 给定的ActionFilter执行它应该执行的操作。
  3. 我很无能为力。谁能让我朝着正确的方向推动我真正需要测试的东西?我的安排,行动和断言部分应包含哪些内容?


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

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

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

2 个答案:

答案 0 :(得分:4)

在测试中使用反射。

   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...

 }

答案 1 :(得分:0)

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

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