User.Identity.Name被模拟后返回null

本文关键字:返回 null 模拟 Identity Name User | 更新日期: 2023-09-27 18:06:24

我有一点粗糙的时间试图找出为什么我嘲笑的User.Identity.Name返回空,当我运行我的测试。我有一种感觉,当我打电话给控制器时,我可能搞砸了。ControllerContext,因为我在那一点上设置了一些路由,但我不确定如何调整以回到分配对象,因为我在以前的测试中所做的。我正在使用Moq与MSTest。下面是我的测试:

[TestMethod]
    public void Leave_Request_Process_Approved()
    {
        var routes = new RouteCollection();
        routes.MapHttpRoute(name: "myAPI", routeTemplate: "api/myFolder/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
        RouteConfig.RegisterRoutes(routes);
        var controllerContext = new Mock<ControllerContext>();
        var session = new Mock<HttpSessionStateBase>();
        session.SetupGet(s => s["altUser"]).Returns("Mod");
        controllerContext.Setup(p => p.HttpContext.Session).Returns(session.Object);
        controllerContext.Setup(p => p.HttpContext.User.Identity.Name).Returns("User");
        controllerContext.Setup(p => p.HttpContext.Request.UserHostAddress).Returns("127.0.0.1");
        var request = new Mock<HttpRequestBase>();
        request.Setup(x => x.ApplicationPath).Returns("/");
        request.Setup(x => x.Url).Returns(new Uri("http://temp-removed"));
        request.Setup(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection());
        var context = new Mock<HttpContextBase>();
        context.SetupGet(x => x.Request).Returns(request.Object);
        var response = new Mock<HttpResponseBase>();
        response.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(x => x);
        context.Setup(x => x.Response).Returns(response.Object);
        var controller = new myController();
        controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
        controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes);
        Assert.IsNotNull(controller.Process(5058, "A", ""));
    }

对于我过去构建的测试,我通常有一个控制器。ControllerContext:

controller.ControllerContext = controllerContext.Object;

我试着看看是否有任何controllerContext。设置选项或上下文。设置选项,我可以使用,但智能感知没有提供任何选项,我可以看到能够取代我在我的路由信息中调用的地方。

User.Identity.Name被模拟后返回null

不模拟ControllerContext,您应该能够为HttpContextBase.User设置一个模拟:

context.SetupGet(c => c.User.Identity.Name).Returns("user");

然后将模拟的Http上下文传递给ControllerContext函数