38

I have code in the controller which consumes HttpContext

public ActionResult Index()
{

   var currentUser=HttpContext.User.Identity.Name;
   ......

}

While trying to write test using NUnit like this

[Test]
public void CanDisplayRequest()
{
    //Act
    var result=  (ViewResult)_requestController.Index();

    //Assert
    Assert.IsInstanceOf<OrderRequest>(resut.Model);
}

Test will fail because it couldn't find HttpContext

So how can I mock HttpContext.Current.User.Identity.Name

I'm using Moq for Mocking

devlin carnate
  • 8,309
  • 7
  • 48
  • 82
banty
  • 1,019
  • 1
  • 8
  • 9

2 Answers2

60

you can initialize your controller with fake context with fake principal as shown below

var fakeHttpContext = new Mock<HttpContextBase>();
var fakeIdentity = new GenericIdentity("User");
var principal = new GenericPrincipal(fakeIdentity, null);

fakeHttpContext.Setup(t => t.User).Returns(principal);
var controllerContext = new Mock<ControllerContext>();
controllerContext.Setup(t => t.HttpContext).Returns(fakeHttpContext.Object);

_requestController = new RequestController();

//Set your controller ControllerContext with fake context
_requestController.ControllerContext = controllerContext.Object;
jtate
  • 2,612
  • 7
  • 25
  • 35
banty
  • 1,019
  • 1
  • 8
  • 9
  • 2
    Do guys also have a snippet for doing the same thing but uses microsft fakes/test and not any other 3rd party testing framework? – Randel Ramirez Mar 18 '14 at 15:45
4

To do it using Microsoft tests only (no 3rd party frameworks), you can do as below:

public class MockHttpContextBase : HttpContextBase
{
    public override IPrincipal User { get; set; }

}

And then...

        var userToTest = "User";
        string[] roles = null;

        var fakeIdentity = new GenericIdentity(userToTest);
        var principal = new GenericPrincipal(fakeIdentity, roles);
        var fakeHttpContext = new MockHttpContextBase { User = principal };
        var controllerContext = new ControllerContext
        {
            HttpContext = fakeHttpContext
        };

        // This is the controller that we wish to test:
        _requestController = new RequestController();

        // Now set the controller ControllerContext with fake context
        _requestController.ControllerContext = controllerContext;           
Rocklan
  • 7,888
  • 3
  • 34
  • 49