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

标签 c# model-view-controller testing httpcontext

我有一个项目需要提供 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/

相关文章:

c# - 有没有什么方法可以像在 C# 中那样使用不变区域性在 Excel 中格式化日期单元格

java - 将现有凌乱的 web 应用程序迁移到优雅的 MVC 的最佳方法是什么?

java - 使用Arquillian进行测试,如何共享Arquillian.xml?

testing - 使用 Selenium,xpath 找不到 'text' 元素

c# - 多种具体类型的 CaSTLe Windsor IoC 容器实例化

c# - 带有 MVC 4 的 VS 2010 中关于缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用的警告消息

C# TabControl Selected 事件似乎不起作用

security - 检查是否登录的最佳位置——Codeigniter/PHP

javascript - expressjs中的路由错误

java - Selenium Chrome 驱动程序选择证书弹出确认不起作用