1

В проекте, над которым я работаю, я, наконец, дошел до того, что я пишу спецификацию SpecFlow для части проекта.Вызов авторизации на контроллере для тестирования функции

Но, одна небольшая проблема - в нашем приложении есть фильтр авторизации, который мне нужно вызвать для некоторых тестов.

Фильтр авторизации выглядит немного как это (много) здесь редакцию

public class Authorization : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if(filterContext == null 
      || filterContext.Controller == null 
      || filterContext.Controller.ControllerContext == null) 
      throw new ArgumentException("Incomplete filter context."); 

     if(! filterContext.Controller.ControllerContext.IsChildAction) 
     { 
      if(filterContext.RequestContext == null 
       || filterContext.RequestContext.HttpContext == null 
       || filterContext.RequestContext.HttpContext.Request == null 
       || filterContext.RequestContext.HttpContext.Request.Url == null) 
       throw new ArgumentException("Incomplete request in filter context."); 

      // SNIP: Authorization checks and activities. 

      // This one line is a bit tricky to mock... 
      HttpRequestBase request = filterContext.HttpContext.Request; 

      // SNIP: Other activities that come after 
     } 
    } 

    // SNIP: Other supporting methods that don't pertain to the problem domain. 
} 

... И в моем художественном тесте, я пытаюсь вызвать его в специальном Данный шаг:

[Given(@"I am logged in as (.*)")] 
public void GivenIAmLoggedInAsX(string userId) 
{ 
    _controller = new SpecificController(); 
    _controller.ControllerContext = new ControllerContext(new HttpContextMock(), new RouteData(), _controller); 

    Authorization authorize = new Authorization(); 
    AuthorizeContext authContext = new AuthorizationContext(_controller.ControllerContext); 
    authorize.OnAuthorization(authContext); 

    // SNIP: Other activities that don't pertain to the question. 
} 

... Это не сработало, чтобы генерировать много NotImplementedExceptions на тестовых примерах, которые я собираю.

После запроса моей команды кто-то упомянул класс ControllerActionInvoker в MVC. К сожалению, MS Documentation немного дряблый по деталям, например, как лучше всего использовать его.

Кроме того, StackOverflow also failed me в моих попытках выяснить, как использовать ControllerActionInvoker. The WayBack Machine тоже не помогло.

Я пробовал несколько разных способов в качестве промежуточных мер, которые не дали никаких результатов и большого количества разочарований.

Вопрос: Мне абсолютно необходимо вызвать этот фильтр в тесте, с которым я работаю, и прямой подход не работает. Каков наилучший способ вызвать фильтр для тестирования функции?

Боковая справка: Вся система фильтрации MVC - это неисследованная территория для меня, поэтому я многое не знаю. В вашем ответе предположите, что я почти ничего не знаю, потому что это, вероятно, точно, даже с исследованиями, которые я сделал о способах этого.

Реализация Alt # 1

Я нашел свой оригинальный пример использует устаревший конструктор; вместо этого рекомендуется использовать конструктор 2-arg. Таким образом, я использовал его для хорошего эффекта. Вот как это выглядит (еще прямой подход :)

[Given(@"I am logged in as (.*)")] 
public void GivenIAmLoggedInAsX(string userId) 
{ 
    _controller = new RequestFormController(); 
    _controller.ControllerContext = new ControllerContext(new HttpContextMock(), new RouteData(), _controller); 

    Authorization authorize = new Authorization(); 
    MethodInfo method = typeof (MyController).GetMethod("MyAction"); 
    ControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(typeof(MyController)); 
    ActionDescriptor actionDescriptor = new ReflectedActionDescriptor(method, "MyAction", controllerDescriptor); 
    AuthorizationContext authContext = new AuthorizationContext(_controller.ControllerContext, actionDescriptor); 
    authorization.OnAuthorization(authContext); 

    // SNIP: Unrelated code. 
} 

ответ

1

Из моего опыта, я хотел бы предложить тестирование функциональности OnAuthorization с помощью модульного тестирования или интеграции.

Я бы использовал Specflow вместе с веб-драйвером, чтобы протестировать сценарий исключительно из контекста браузера т. Е. Тестирование функции только путем взаимодействия с веб-сайтом. Следовательно, ваш «данный» должен просто использовать веб-драйвер для проверки того, что пользователь вошел в систему как «userId», например. проверяя наличие своего имени на веб-странице или что-то подобное.

Смежные вопросы