Set User property for an ApiController in Unit Test

asp.net-web-api, c#, iprincipal

Solution

Set the `Thread.CurrentPrincipal`, and that will initialize the `User` property in the controller automatically.

For people that see this answer, but have no idea how to set `CurrentPrincipal`.: This code is extracted from MSDN.

Thread.CurrentPrincipal = new GenericPrincipal
(
   new GenericIdentity("Bob", "Passport"),
   new[] {"managers", "executives"}
);

Problem

My unit tests for an ApiController uses some helpers methods to instantiate the controller: ``` public static ResourcesController SetupResourcesController(HttpRequestMessage request, IResourceMetadataRepository repo, IUnitOfWorkService unitOfWorkService) { var config = new HttpConfiguration(); var defaultRoute = config.Routes.MapHttpRoute(RouteNames.DefaultApi , "api/{controller}/{id}"); var routeData = new HttpRouteData(defaultRoute, new HttpRouteValueDictionary { { "controller", "resources" } }); var resourcesController = new ResourcesController(repo, unitOfWorkService) { ControllerContext = new HttpControllerContext(config, routeData, request), Request = request }; resourcesController.Request.Properties.Add(HttpPropertyKeys.HttpRouteDataKey, routeData); resourcesController.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; // Compilation fail: The Property 'System.Web.Http.ApiController.User' has no setter. resourcesController.User = myStubUserPrincipal; return resourcesController; } ``` My question is: how to set the User property for the controller? I've tried: ``` request.Properties.Add("MS_UserPrincipal", myStubUserPrincipal); ``` But this doesn't work either (the resourcesController.User property remains null).

Original source