如何在调用httpcontext.current的MVC控制器上进行集成测试



我需要在每个方法中调用httpcontext.current的ASP.NET MVC控制器上进行集成测试。我已经尝试了各种方法,并且已经进行了大量研究,尽管我觉得我缺少了一些东西。我走了:

的路线
  • ASP.NET核心:我使用ASP.NET核心测试主机在Stack溢出上发现了一个黑客,该主机由Stefan Steiger(如何在ASP.NET Core中获取httpcontext.current?)。这是一个很好的解决方案。但是,在尝试实施和进一步阅读后,看来这只能与Aspnetcore控制器一起使用,并且不兼容。我知道有垫片,但是我找不到有关如何使用它的任何指示。
  • 使用批处理文件旋转IIS Express并进行呼叫。我使用这种方法的问题是我需要能够在测试中进行调试。我尝试连接Visual Studio调试器,但是由于某些原因,这是不起作用的。我一直在断点上收到消息:"断点当前不会被击中。此文档没有加载符号"。
  • 我还研究了如何通过编程测试控制器启动该项目,但找不到如何以编程方式启动Visual Studio Web项目。(着眼于通过过程和MSBUILD启动它)
  • 目前,我正在使用OWIN Self Host进行测试,但是,HTTPContext.Current在控制器中为NULL(显然)。如果有解决方案,那是最可取的方法。

关于如何完成这些测试的任何建议将不胜感激。

谢谢,

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

 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实例的调试器。

取决于为什么使用 HttpContext.Current,您可以修改代码以使用HttpContext类的 CC_2属性。

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

相关链接:

  • https://www.danylkoweb.com/blog/how-to-successcesselly-mock-httpcontext-bt
  • ASP/NET MVC:测试控制器带有会话?嘲笑?
  • 如何模拟ASP.NET MVC中控制器上的请求?
  • ASP.NET MVC单元测试控制器带有HTTPContext

最新更新