Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set User property for an ApiController in Unit Test

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

like image 795
JTech Avatar asked Mar 14 '13 15:03

JTech


2 Answers

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"} ); 
like image 115
Pablo Cibraro Avatar answered Sep 23 '22 22:09

Pablo Cibraro


A cleaner way would be to mock away IPrincipal and HttpRequestContext, for example using Moq:

var userMock = new Mock<IPrincipal>(); 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<HttpRequestContext>(); requestContext.Setup(x => x.Principal).Returns(userMock.Object);  var controller = new ControllerToTest() {     RequestContext = requestContext.Object,     Request = new HttpRequestMessage(),     Configuration = new HttpConfiguration() }; 
like image 37
Stanislav Avatar answered Sep 24 '22 22:09

Stanislav