使用授权对 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);
}
我尝试在 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);
}