Impostare la proprietà User per un ApiController in Unit Test

Il mio unit test per un ApiController utilizza alcuni metodi di aiuto per istanziare il 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; } 

La mia domanda è: come impostare la proprietà User per il controller?

Ho provato:

 request.Properties.Add("MS_UserPrincipal", myStubUserPrincipal); 

Ma questo non funziona (la proprietà resourcesController.User rimane nullo).

    Impostare Thread.CurrentPrincipal e questo inizializzerà automaticamente la proprietà User nel controller.

    Per le persone che vedono questa risposta, ma non hanno idea di come impostare CurrentPrincipal : questo codice viene estratto da MSDN.

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

    Un modo più semplice sarebbe deridere via IPrincipal e HttpRequestContext , ad esempio usando Moq:

     var userMock = new Mock(); userMock.Setup(p => p.IsInRole("admin")).Returns(true); userMock.SetupGet(p => p.Identity.Name).Returns("tester"); userMock.SetupGet(p => p.Identity.IsAuthenticated).Returns(true); var requestContext = new Mock(); requestContext.Setup(x => x.Principal).Returns(userMock.Object); var controller = new ControllerToTest() { RequestContext = requestContext.Object, Request = new HttpRequestMessage(), Configuration = new HttpConfiguration() };