如何在调用httpcontext.current

时间:2016-12-06 14:39:07

标签: c# asp.net asp.net-mvc httpcontext

我需要在ASP.Net MVC控制器上进行集成测试,该控制器在每个方法中调用HttpContext.Current。我已经尝试了各种方法并且已经做了大量的研究,尽管我觉得有些东西我不知道了。我走了路线:

  • Asp.Net核心:我发现了使用asp.net核心测试主机Stefan Steiger(How to get HttpContext.Current in ASP.NET Core?)提供的堆栈溢出问题。这是一个很好的解决方案。但是,在尝试实现和进一步阅读时,似乎这只适用于aspnetcore控制器,并且不向后兼容。我知道一个垫片但是我找不到任何关于如何使用它的说明。
  • 使用批处理文件旋转iis express并进行调用。我用这种方法得到的问题是我需要能够在测试中进行调试。我尝试连接visual studio调试器,但这是因为某些原因无法正常工作。我一直在断点上收到消息"断点当前不会被击中。没有为此文档加载符号"。
  • 我还研究了如何以编程方式使用测试控制器启动项目,但无法找到如何以编程方式启动Visual Studio Web项目。 (查看通过进程和msbuild启动它)
  • 目前我正在使用owin self host进行测试,但是,控制器中的HttpContext.Current是空的(显然)。如果有办法,这是最好的方法。

非常感谢任何有关如何完成这些测试的建议。

谢谢,

编辑,我使用以下方法附加:

 private static bool AttachToIIS(int tries = 10, int threadsleep = 500)
    {
        System.Threading.Thread.Sleep(1000);
        bool isAttached = false;
        int count = 0;
        while (isAttached == false && count < tries)
        {
            _DTE dte = (_DTE)Marshal.GetActiveObject("VisualStudio.DTE.14.0");
            Processes processes = dte.ActiveWindow.DTE.Debugger.LocalProcesses;
            foreach (EnvDTE.Process process in processes)
            {
                System.Diagnostics.Debug.WriteLine("process: " + process.Name);
                try
                {
                    if (process.Name.Contains("iis"))
                    {
                        process.Attach();
                        isAttached = true;
                    }
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine(e.Message);
                }
            }
            System.Threading.Thread.Sleep(threadsleep);
            count++;
        }
        return isAttached;
    }

一个奇怪的是,当我附加到调试器(我不是COM专家)时,它会附加首先打开的visual studio实例的调试器。

1 个答案:

答案 0 :(得分:0)

根据为什么使用HttpContext.Current,您可以修改代码以改为使用Controller类的HttpContext属性。

然后,您可以为可以包含HTTP上下文的测试创建自定义ControllerContext。请注意,MVC比旧的ASP.NET更智能,因为它使用HttpContextBase,您可以在测试中继承甚至模拟完全自定义的HTTP上下文。

相关链接: