我如何UnitTest自定义ActionFilter?

Tom*_*han 6 asp.net-mvc unit-testing action-filter

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

我希望能够测试两件事:

  1. 将给定的ActionFilter应用于某个操作(以确保该操作符合要求)
  2. 给定的ActionFilter执行它应该执行的操作.

而且我很无能为力.谁能让我朝着正确的方向推动我真正需要测试的东西?我的安排,行动和断言部分应包含哪些内容?


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

我有一个CustomValidationFilter应该检查两个提交的表单值是否相同,ModelStateError如果没有则添加一个.我想验证所加入的错误与正确的错误消息,如果值是不一样的,那就是错误如果值增加相等的(且非空).

我也有一个Write动作GuestbookController.我想验证过滤器是否已应用于此操作.

tva*_*son 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 );
Run Code Online (Sandbox Code Playgroud)

为类中的方法创建单元测试。使用适当的数据模拟 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...

 }
Run Code Online (Sandbox Code Playgroud)