首页 文章

使用授权对Azure Mobile .NET控制器进行单元测试

提问于
浏览
1

我尝试在Azure Mobile App .Net Server中使用授权对我的api控制器进行单元测试 .

我的控制器方法如下所示:

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

我的控制器方法通过localhost上的swagger正常工作,但是通过unittest方法它不起作用 . 当我尝试检索经过身份验证的用户信息时, claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier) 返回 null

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

1 回答

  • 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 = "username@example.com";
        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);
    }
    

相关问题