Writing Unit Test for methods that use User.Identity.Name in ASP.NET Web API Writing Unit Test for methods that use User.Identity.Name in ASP.NET Web API asp.net asp.net

Writing Unit Test for methods that use User.Identity.Name in ASP.NET Web API


The below one is only one way of doing this:

public class FooController : ApiController {    public string Get() {        return User.Identity.Name;    }}public class FooTest {    [Fact]    public void Foo() {        var identity = new GenericIdentity("tugberk");        Thread.CurrentPrincipal = new GenericPrincipal(identity, null);        var controller = new FooController();        Assert.Equal(controller.Get(), identity.Name);    }}


Here's another way I found in the NerdDinner testing tutorial. It worked in my case:

DinnersController CreateDinnersControllerAs(string userName){    var mock = new Mock<ControllerContext>();    mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);    mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);    var controller = CreateDinnersController();    controller.ControllerContext = mock.Object;    return controller;}[TestMethod]public void EditAction_Should_Return_EditView_When_ValidOwner(){    // Arrange    var controller = CreateDinnersControllerAs("SomeUser");    // Act    var result = controller.Edit(1) as ViewResult;    // Assert    Assert.IsInstanceOfType(result.ViewData.Model, typeof(DinnerFormViewModel));}

Make sure you read the full section: Mocking the User.Identity.Name property

It uses the Moq mocking framework that you can install in your Test project using NuGet: http://nuget.org/packages/moq


With WebApi 5.0 this is slightly different. You can now do:

controller.User = new ClaimsPrincipal(  new GenericPrincipal(new GenericIdentity("user"), null));