【问题标题】:How to Mock HttpContext.User.Identity.Name in Asp.Net MVC 4如何在 Asp.Net MVC 4 中模拟 HttpContext.User.Identity.Name
【发布时间】:2013-10-01 03:29:50
【问题描述】:

我在控制器中有代码消耗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 进行模拟

【问题讨论】:

    标签: c# asp.net-mvc unit-testing


    【解决方案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;
    

    【讨论】:

    • 大家是否也有一个 sn-p 来做同样的事情,但使用的是 microsft fakes/test 而不是任何其他 3rd 方测试框架?
    【解决方案2】:

    要仅使用 Microsoft 测试(无 3rd 方框架),您可以执行以下操作:

    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;           
    

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2017-03-12
      相关资源
      最近更新 更多