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

38

我在控制器中有一个消费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 进行模拟。

2个回答

60
您可以像下面展示的那样,使用虚假上下文和虚假主体来初始化您的控制器。
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;

2
你们有使用Microsoft Fakes/Test而不是其他第三方测试框架完成同样操作的代码片段吗? - Randel Ramirez

5

如果您只使用 Microsoft tests(不使用第三方框架)来完成此操作,可以按照以下步骤进行:

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;           

这个解决方案在我创建测试用例时在ASP.Net MVC应用程序中运行良好。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接