C# 在单元测试中设置ApicController的用户属性

C# 在单元测试中设置ApicController的用户属性,c#,asp.net-web-api,iprincipal,C#,Asp.net Web Api,Iprincipal,ApicController的我的单元测试使用一些helpers方法来实例化控制器: public static ResourcesController SetupResourcesController(HttpRequestMessage request, IResourceMetadataRepository repo, IUnitOfWorkService unitOfWorkService) { var config = new HttpConfiguration();

ApicController的我的单元测试使用一些helpers方法来实例化控制器:

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;
}
我的问题是:如何设置控制器的用户属性

我试过:

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

但是这也不起作用(resourcesController.User属性仍然为空)。

设置
线程.CurrentPrincipal
,这将自动初始化控制器中的
用户属性


对于看到此答案但不知道如何设置
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()
};
var userMock=new Mock();
Setup(p=>p.IsInRole(“admin”))。返回(true);
userMock.SetupGet(p=>p.Identity.Name).Returns(“tester”);
userMock.SetupGet(p=>p.Identity.IsAuthenticated)。返回(true);
var requestContext=new Mock();
Setup(x=>x.Principal).Returns(userMock.Object);
var控制器=新控制器测试()
{
RequestContext=RequestContext.Object,
请求=新建HttpRequestMessage(),
配置=新的HttpConfiguration()
};

谢谢Pablo!似乎太简单而不真实,但是的;在我的测试设置代码中设置Thread.CurrentPrincipal属性就成功了!伟大的我一直在寻找如何模仿/假装一切,这是一个简单的方法。对于那些看到这个答案但不知道如何设置的人来说。此代码是从MSDN中提取的。Thread.CurrentPrincipal=新的GenericPrincipal(新的GenericEntity(“Bob”、“Passport”)、新的[]{“经理”、“高管”});如果需要,请将此添加到您的答案中。我尝试在Web Api 2的单元测试中使用此方法,但用户属性始终为null。您也可以直接在控制器上设置它,如:
resourcesController.RequestContext.Principal=new…