我需要在每个方法中调用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