Как Mock HttpContext.User.Identity.Name в Asp.Net MVC 4

У меня есть код в контроллере, который потребляет HttpContext

public ActionResult Index()
{

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

}

При попытке написать тест с помощью NUnit, как этот

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

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

Тест завершится неудачно, потому что он не смог найти HttpContext

Итак, как я могу высмеять HttpContext.Current.User.Identity.Name

Я использую Moq для Mocking

Ответ 1

вы можете инициализировать свой контроллер фальшивым контекстом с помощью поддельного принципала, как показано ниже.

        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;