gpt4 book ai didi

c# - 依赖 HTTPContext 的 MVC 测试操作

转载 作者:行者123 更新时间:2023-11-28 20:46:34 26 4
gpt4 key购买 nike

我有一个项目需要提供 Action 测试。我的做法是确保操作不依赖于它们未作为参数接收的任何内容,主要使用 ValueProviders 和 ModelBinders。因此,我会传入 HTTPContextBase 等。

但是,我现在有一个使用静态类的操作,该静态类是 HTTPContext 的包装器来访问 Session 和 Identity。因此,我似乎必须模拟 HTTPContext 来测试此操作。我想并不太复杂,但就是感觉不对。

我的直觉是应该重新开发静态类以使用 HTTPSessionStateBase 和 IPrinicple 实例化并将它们用作内部存储。然后我可以在我的 Action 中实例化这个包装器,从 Action 参数,使 Action 和包装器类更易于测试。

如果我不必将我的静态类更改为实例,这是一个推荐的方法还是有人有任何其他想法?

最佳答案

我认为使用 Moq模拟 HttpContext 正是您可能想要尝试的方式。

[TestMethod]
public void Test()
{

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
context.Setup(c => c.Request).Returns(request.Object);

HomeController controller = new HomeController();

controller.ControllerContext = new ControllerContext( context , new RouteData(), controller );

....
...........
}




已更新:
如果您想模拟 HttpSession(如评论中提到的 gdoron)。这并不复杂,因为您正在模拟某些东西并不意味着您必须构建完整的、真实的对象及其所有属性。

假设你的 Controller 将

  1. 检查用户是否通过身份验证。
  2. 获取身份名称。
  3. 从 Session["key"] 获取一个值。
  4. 操纵 cookie。

代码可能是这样的:

[TestMethod]
public void Test()
{
......
.........
var mockedControllerContext = new Mock<ControllerContext> ();
mockedControllerContext.SetupGet(p => p.HttpContext.Session["key"]).Returns("A value in session");
mockedControllerContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
mockedControllerContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("An identity name");
mockedControllerContext.SetupGet(p => p.HttpContext.Response.Cookies).Returns(new HttpCookieCollection ());

HomeController controller = new HomeController();
controller.ControllerContext = mockedControllerContext.Object;
.....
......

}

关于c# - 依赖 HTTPContext 的 MVC 测试操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com