如何在Asp.Net MVC 4中模拟HttpContext.User.Identity.Name

我在控制器中有代码消耗HttpContext

 public ActionResult Index() { var currentUser=HttpContext.User.Identity.Name; ...... } 

尝试使用像这样的NUnit编写测试时

 [Test] public void CanDisplayRequest() { //Act var result= (ViewResult)_requestController.Index(); //Assert Assert.IsInstanceOf(resut.Model); } 

测试将失败,因为它找不到HttpContext

那么如何模拟HttpContext.Current.User.Identity.Name

我正在使用Moq进行模拟

您可以使用假主体伪造上下文来初始化您的控制器,如下所示

  var fakeHttpContext = new Mock(); var fakeIdentity = new GenericIdentity("User"); var principal = new GenericPrincipal(fakeIdentity, null); fakeHttpContext.Setup(t => t.User).Returns(principal); var controllerContext = new Mock(); controllerContext.Setup(t => t.HttpContext).Returns(fakeHttpContext.Object); _requestController = new RequestController(); //Set your controller ControllerContext with fake context _requestController.ControllerContext = controllerContext.Object; 

要仅使用Microsoft测试(没有第三方框架),您可以执行以下操作:

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

然后…

  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;