如何调用特定的Controller Action来测试其中的代码,尤其是会话变量?

时间:2016-06-20 23:25:58

标签: asp.net-mvc asp.net-mvc-5

我在ASP.NET 4.5上使用MVC5

我想调试特定的Controller Actions而不运行整个应用程序,我需要知道如何导航到特定的Action,除了花费很多时间,因为我有很多代码需要重构和测试。

我已经考虑了单元测试,但使用调试器似乎更适合我正在做的事情。

此外,我在行动代码中也有会话变量。

我最接近解决方案的是在家中有一个包装动作即:

    public ActionResult Tx()
    {
        return new MyApp.Areas.Area1.Controllers.OrderController().Index();
    }

然后我会将相关的命名空间,控制器和动作与任何相关的参数复制并粘贴到" Tx"动作。

这确实调用了相关的Action,而我无需导航到特定的Action。我只是打电话给Home / Tx。但是我的Session变量代码出现了null异常错误:

Session["OrderID"]=null

调试Action,当我直接从应用程序导航时,Session变量可以正常工作。当我使用Home / Tx时,它仍然在Dev Web Server和Debug过程中,但也许我在新的上下文中,因为另一个Action正在创建Controller。

1)知道为什么我的想法不适用于Session变量吗?

2)如果有人对如何调用特定的控制器动作有更好的了解,那么我将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:1)

在使用之前,您需要在控制器上调用Initialize方法。尝试类似:

    var httpContext = new HttpContextWrapper(HttpContext.Current);
    var routeData = RouteTable.Routes.GetRouteData(httpContext);

    var controller = new MyApp.Areas.Area1.Controllers.OrderController(); 
    controller.Initialize(new RequestContext(httpContext, routeData)); 
    return controller.Index();