2017-01-11 26 views
5

Używam Web API 2. W kontrolerze web api użyłem metody GetUserId do wygenerowania identyfikatora użytkownika przy użyciu Asp.net Identity.Jak wygenerować Asp.net Tożsamość użytkownika podczas testowania kontrolerów WebApi

Muszę napisać test jednostki MS dla tego kontrolera. Jak uzyskać dostęp do identyfikatora użytkownika z projektu testowego?

Załączam przykładowy kod poniżej.

Web API Controller

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

Web API klasa testowania kontrolera

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

Próbowałem za pomocą metody makiety jak powyżej. Ale to nie działa. Jak wygenerować tożsamość użytkownika Asp.net, gdy wywołuję metodę testowania do kontrolera?

Odpowiedz

4

Jeżeli wniosek został uwierzytelniony wtedy własność użytkownika powinny być wypełniane na tej samej zasadzie

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

dla ApiController można ustawić User mienia podczas aranżacji badanej jednostki. Że metoda rozszerzenie jednak szuka ClaimsIdentity więc należy podać jedną

Test będzie teraz wyglądać

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