with net mvc asp c# asp.net-web-api iprincipal

c# - mvc - oauth 2.0 asp net web api



Establecer propiedad de usuario para un ApiController en la prueba unitaria (2)

Las pruebas de mi unidad para un ApiController utilizan algunos métodos de ayuda para crear instancias del controlador:

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

Mi pregunta es: ¿cómo establecer la propiedad del usuario para el controlador?

He intentado:

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

Pero esto tampoco funciona (la propiedad resourcesController.User permanece nula).


Establezca Thread.CurrentPrincipal , y eso inicializará automáticamente la propiedad del User en el controlador.

Para las personas que ven esta respuesta, pero no tienen idea de cómo configurar CurrentPrincipal . Este código se extrae de MSDN.

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


Una forma más limpia sería burlarse de IPrincipal y HttpRequestContext , por ejemplo, usando 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() };