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