2016-04-04 159 views
1

我尝试使用Azure移动应用程序.Net Server中的授权对我的api控制器进行单元测试。具有授权的单元测试Azure移动.NET控制器

我控制器的方法是这样的:

[Authorize] 
public HttpResponseMessage SomeMethod() 
{ 
    var claimsPrincipal = this.User as ClaimsPrincipal; 
    string userId = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value; 
    return Request.CreateResponse(HttpStatusCode.OK, userId); 
} 

我在单元测试方法类似这样的配置我的要求:

[TestMethod] 
public void SomeMyAPIControllerTest(){ 
    var config = new HttpConfiguration(); 
    var request = new HttpRequestMessage(); 
    request.RequestUri = new Uri("http://localhost:50268/api/MyAPI"); 
    request.Headers.Add("x-zumo-auth", "_user_auth_token_"); 
    request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 
    var controller = new MyAPIController(TestContext) 
    { 
     Request = request 
    }; 
    var response = controller.SomeMethod(); 
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
} 

我控制器的方法通过在本地主机上招摇工作正常,但通过单元测试方法这是行不通的。 当我尝试检索经过身份验证的用户信息时,claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)返回null

我想在请求配置中有一个错误。有什么建议么?

回答

1

为了测试您可以直接在ApiController上设置User

更新您的测试方法,为控制器创建一个假用户。

[TestMethod] 
public void SomeMyAPIControllerTest(){ 
    // Arrange 
    var config = new HttpConfiguration(); 
    var request = new HttpRequestMessage(); 
    request.RequestUri = new Uri("http://localhost:50268/api/MyAPI"); 
    request.Headers.Add("x-zumo-auth", "_user_auth_token_"); 
    request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 
    //Create test user 
    var username = "[email protected]"; 
    var identity = new GenericIdentity(username, ""); 
    //Add fake claim for test 
    var nameIdentifierClaim = new Claim(ClaimTypes.NameIdentifier, username); 
    identity.AddClaim(nameIdentifierClaim); 
    var principal = new GenericPrincipal(identity, roles: new string[] { }); 
    var user = new ClaimsPrincipal(principal); 
    // Set the User on the controller directly 
    var controller = new MyAPIController(TestContext) 
    { 
     Configuration = config, 
     Request = request, 
     User = user 
    }; 

    //Act 
    var response = controller.SomeMethod(); 

    //Assert 
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
} 
+0

谢谢@Nkosi。用你的例子,我可以得到“身份/声明/名称:[email protected]”,但是如何添加“身份/声明/名称标识符”类型? – deman4ik

+0

@ deman4ik我已经更新了答案,以包含您请求的信息。如果你觉得这个问题有帮助,可以随意投票。如果这确实可以解决您的问题,请不要忘记标记为已回答。谢谢 – Nkosi

+0

是的,这正是我想要的!谢谢! – deman4ik