В проекте, над которым я работаю, я, наконец, дошел до того, что я пишу спецификацию 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.
}