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

Unit Testing Azure Mobile .NET Controller with Authorization

我尝试在 Azure 移动应用 .Net 服务器中使用授权对我的 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);
}

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

估计请求配置有误。有什么建议吗?

为了您的测试,您可以直接在 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);
}