Как я могу UnitTest пользовательский ActionFilter? - PullRequest
6 голосов
/ 01 июня 2009

Я пытался найти некоторую прямую информацию по этому вопросу, но я не смог - либо то, что я обнаружил, было неясным для меня, чтобы понять, что происходит, либо слишком конкретное для неправильной вещи Например, учебник, который я нашел для модульного тестирования AuthorizeAttribute. (Третья альтернатива - конечно, я слишком туп, чтобы понять, что читаю информацию, которую ищу ... в этом случае мне все еще нужна помощь, потому что я туп: P)

Я бы хотел проверить две вещи:

  1. что данный ActionFilter применяется к действию (чтобы убедиться, что действие соответствует требованиям)
  2. Что данный ActionFilter делает то, что должен делать.

И я не в курсе. Кто-нибудь может подтолкнуть меня в правильном направлении относительно того, что мне на самом деле нужно проверить? Что должны содержать мои разделы Arrange, Act и Assert в тестах?


Небольшая деталь, если я не достаточно ясен:

У меня есть CustomValidationFilter, который должен проверить, совпадают ли два отправленных значения формы, и добавить ModelStateError, если нет. Я хочу убедиться, что ошибка добавлена ​​с правильным сообщением об ошибке, если значения не совпадают, и что ошибка не добавлена, если значения равны равны (и не нуль).

У меня также есть действие Write на GuestbookController. Я хочу убедиться, что фильтр применяется к этому действию.

Ответы [ 2 ]

4 голосов
/ 01 июня 2009

Использование отражения в вашем тесте.

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

 }
0 голосов
/ 01 июня 2009

Вот сообщение в блоге, в котором описывается, как расширить и протестировать пользовательский фильтр авторизации. В блоге подробно рассматриваются обе ваши проблемы, а именно, как проверить, что данный ActionFilter применяется к действию, а также как проверить, что ActionFilter делает то, что должен.

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

...