Set User property for an ApiController in Unit Test

JTech picture JTech · Mar 14, 2013 · Viewed 8.3k times · Source

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

Answer

Pablo Cibraro picture Pablo Cibraro · Mar 15, 2013

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"}
);