设置用户属性的单元测试

问题描述:

我的单元测试的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; 
} 

我的问题是:如何设置用户属性控制器?

我已经试过:

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

但是,这并不工作,要么(在resourcesController.User财产保持为空)。

设置Thread.CurrentPrincipal,这将自动初始化控制器中的User属性。

对于看到此答案的人,但不知道如何设置CurrentPrincipal。: This code是从MSDN中提取的。

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

谢谢巴勃罗!看起来太简单了,但是没错,在我的测试设置代码中设置Thread.CurrentPrincipal属性的窍门! – JTech 2013-03-19 15:59:30

+0

太棒了!我正在寻找如何嘲笑/伪造一切,这是一个简单的方法。 – Aligned 2013-06-05 15:27:19

+3

对于看到此答案的人,但不知道如何设置CurrentPrincipal。此代码是从MSDN中提取的。 (新的GenericIdentity(“Bob”,“Passport”),新的[] {“managers”,“executive”}); http://msdn.microsoft.com/en-us/library/system.threading.thread.currentprincipal.aspx 如果你愿意,可以添加它到你的答案。 – ruffen 2013-09-19 12:24:41

一个清洁的方法是使用起订量嘲笑走IPrincipalHttpRequestContext,例如:

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