2017-01-11 22 views
5

我正在使用Web API 2.在web api控制器中,我使用GetUserId方法使用Asp.net标识生成用户标识。如何在测试WebApi控制器时生成Asp.net用户标识

我必须为该控制器编写MS单元测试。我如何从测试项目访问用户ID?

我附上下面的示例代码。

网页API控制器

public IHttpActionResult SavePlayerLoc(IEnumerable<int> playerLocations) 
{ 
    int userId = RequestContext.Principal.Identity.GetUserId<int>(); 
    bool isSavePlayerLocSaved = sample.SavePlayerLoc(userId, playerLocations); 
    return Ok(isSavePlayerLocSaved); 
} 

网页API控制器测试类

[TestMethod()] 
public void SavePlayerLocTests() 
{ 
    var context = new Mock<HttpContextBase>(); 
    var mockIdentity = new Mock<IIdentity>(); 
    context.SetupGet(x => x.User.Identity).Returns(mockIdentity.Object); 
    mockIdentity.Setup(x => x.Name).Returns("admin"); 
    var controller = new TestApiController(); 
    var actionResult = controller.SavePlayerLoc(GetLocationList()); 
    var response = actionResult as OkNegotiatedContentResult<IEnumerable<bool>>; 
    Assert.IsNotNull(response); 
} 

我尝试使用模拟法等的上方。但它不起作用。当我从测试方法调用控制器时,如何生成Asp.net用户标识?

回答

4

如果请求被验证,那么用户属性应该用相同的原理

public IHttpActionResult SavePlayerLoc(IEnumerable<int> playerLocations) { 
    int userId = User.Identity.GetUserId<int>(); 
    bool isSavePlayerLocSaved = sample.SavePlayerLoc(userId, playerLocations); 
    return Ok(isSavePlayerLocSaved); 
} 

ApiController可以安排单元测试过程中设置User属性来填充。但是,这种扩展方法是寻找一个ClaimsIdentity所以你应该提供一个

测试现在看起来像

[TestMethod()] 
public void SavePlayerLocTests() { 
    //Arrange 
    //Create test user 
    var username = "admin"; 
    var userId = 2; 

    var identity = new GenericIdentity(username, ""); 
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId.ToString())); 
    identity.AddClaim(new Claim(ClaimTypes.Name, username)); 

    var principal = new GenericPrincipal(identity, roles: new string[] { }); 
    var user = new ClaimsPrincipal(principal); 

    // Set the User on the controller directly 
    var controller = new TestApiController() { 
     User = user 
    }; 

    //Act 
    var actionResult = controller.SavePlayerLoc(GetLocationList()); 
    var response = actionResult as OkNegotiatedContentResult<IEnumerable<bool>>; 

    //Assert 
    Assert.IsNotNull(response); 
}