[英]User.Identity.Name returns null after being mocked
我有一段艰难的时间试图弄清楚为什么我模拟的User.Identity.Name在运行测试时返回null。 我有种感觉,当我调用controller.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.Setup选项或context.Setup选项,但是Intellisense并没有为我提供任何可以替换我在路由信息中调用的位置的选项。
除了模拟ControllerContext
,您还应该能够为HttpContextBase.User
建立一个模拟:
context.SetupGet(c => c.User.Identity.Name).Returns("user");
然后将模拟的Http上下文传递给ControllerContext
ctor。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.