Установите свойство пользователя для ApiController в модульном тесте
Мои модульные тесты для ApiController используют несколько вспомогательных методов для создания экземпляра контроллера:
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;
}
Мой вопрос: как установить свойство User для контроллера?
Я пробовал:
request.Properties.Add("MS_UserPrincipal", myStubUserPrincipal);
Но это тоже не работает (свойство resourcesController.User остается нулевым).
2 ответа
Решение
Установить Thread.CurrentPrincipal
и это будет инициализировать User
свойство в контроллере автоматически.
Для людей, которые видят этот ответ, но не знают, как установить CurrentPrincipal
.: Этот код извлечен из MSDN.
Thread.CurrentPrincipal = new GenericPrincipal
(
new GenericIdentity("Bob", "Passport"),
new[] {"managers", "executives"}
);
Более чистым способом было бы издеваться IPrincipal
а также HttpRequestContext
Например, используя 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()
};