Testing controller actions with ActionFilterAttribute in ASP .NET MVC
Hey,
Have you ever wanted to test your controller actions with the logic you add with ActionFilterAttributes?
Well, I did.
So I wrote this helper class, which executes the ActionFilterAttribute methods.
In your test add the following code:
Good luck!
Have you ever wanted to test your controller actions with the logic you add with ActionFilterAttributes?
Well, I did.
So I wrote this helper class, which executes the ActionFilterAttribute methods.
public class FilterAttributeTester { public ActionExecutingContext ExecuteOnActionExecuting<TAttribute>(Controller aController, Func<ActionResult> aAction) where TAttribute : ActionFilterAttribute { var actionExecutingContext = CreateActionExecutingContext(aController, aAction); var attribute = GetAttribute<TAttribute>(aAction); attribute.OnActionExecuting(actionExecutingContext); return actionExecutingContext; } public ActionExecutedContext ExecuteOnActionExecuted<TAttribute>(Controller aController, Func<ActionResult> aAction) where TAttribute : ActionFilterAttribute { var actionExecutedContext = CreateActionExecutedContext(aController, aAction); var attribute = GetAttribute<TAttribute>(aAction); attribute.OnActionExecuted(actionExecutedContext); return actionExecutedContext; } public static ActionExecutingContext CreateActionExecutingContext(Controller aController, Func<ActionResult> aAction) { return new ActionExecutingContext( new ControllerContext(new HttpContextWrapper(HttpContext.Current), new RouteData(), aController), new ReflectedActionDescriptor(aAction.Method, aAction.Method.Name, new ReflectedControllerDescriptor(aController.GetType())), new Dictionary<string, object>()); } public static ActionExecutedContext CreateActionExecutedContext(Controller aController, Func<ActionResult> aAction) { return new ActionExecutedContext( new ControllerContext(new HttpContextWrapper(HttpContext.Current), new RouteData(), aController), new ReflectedActionDescriptor(aAction.Method, aAction.Method.Name, new ReflectedControllerDescriptor(aController.GetType())), false, null); } private static TAttribute GetAttribute<TAttribute>(Func<ActionResult> aAction) where TAttribute : ActionFilterAttribute { return aAction.Method.GetCustomAttributes(typeof(TAttribute), true).Select(x => x as TAttribute).SingleOrDefault(); } }And that's it!
In your test add the following code:
var filterAttributeTester = new FilterAttributeTester(); var actionExecutingContext = filterAttributeTester.ExecuteOnActionExecuting<UserLoggedInAttribute>(homepageController, homepageController.Index); var returnValue = actionExecutingContext.Result as RedirectResult; if (returnValue != null) { // filter attribute redirected to another action }All you have to do is fake HttpContext, and you're good!
Good luck!
I would like to say thank you for the amazing details and concepts you are sharing in this.The style of writing is excellent and also the content is top-notch
ReplyDeleteI would like to say thank you for the amazing details and concepts you are sharing in this.The style of writing is excellent and also the content is top-notch