c# - User.Identity.Name 被模拟后返回 null

标签 c# unit-testing asp.net-web-api moq

我在尝试弄清楚为什么我的模拟 User.Identity.Name 在运行测试时返回 null 时遇到了一些困难。我有一种感觉,当我调用我的 controller.ControllerContext 时我可能搞砸了,因为我当时正在设置一些路由,但我不确定如何调整以返回分配对象,就像我在之前的测试中所做的那样。我将最小起订量与 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", ""));

    }

对于我过去构建的测试,我通常为我的 controller.ControllerContext:

controller.ControllerContext = controllerContext.Object;

我已经尝试查看是否有任何我可以使用的 controllerContext.Setup 选项或 context.Setup 选项,但 Intellisense 没有提供我可以看到的任何选项来替换我在 route 调用的位置信息。

最佳答案

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

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

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

关于c# - User.Identity.Name 被模拟后返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15705224/

相关文章:

c# - NUnit:如何从非静态方法传递 TestCaseData?

c# - 复杂类型在 ApiController 参数中为空

asp.net-web-api - 这个 ASP.Net 和 Fiddler 示例有什么问题?

asp.net-web-api - 如何让 ASP.Net Web API 和 OData 将字符串值绑定(bind)为键?

c# - 在 Entity Framework 中更新实体的最佳方式

c# - 从 Jenkins 的 msBuild 生成的代码运行 nUnit

c# - 针对 MS Access 的 LINQ asp.net 页面。

c# - 如何将对象转换为 Type?

c# - 带函数参数的接口(interface)的最小起订量设置

unit-testing - 为什么在尝试使用 Mockito 或 PowerMock 模拟单例时不抛出任何异常?