gpt4 book ai didi

c# - 如何在调用 httpcontext.current 的 mvc Controller 上进行集成测试

转载 作者:行者123 更新时间:2023-11-30 12:56:26 29 4
gpt4 key购买 nike

我需要在 ASP.Net MVC Controller 上进行集成测试,该 Controller 在每个方法中调用 HttpContext.Current。我已经尝试了各种方法并已经做了很多研究,尽管我觉得我缺少一些东西。我走了以下路线:

  • Asp.Net 核心:我使用由 Stefan Steiger (How to get HttpContext.Current in ASP.NET Core?) 提供的 asp.net 核心测试主机发现了堆栈溢出问题。这是一个很好的解决方案。然而,在尝试实现和进一步阅读时,似乎这只适用于 aspnetcore Controller 并且不向后兼容。我知道垫片,但我找不到任何关于如何使用它的说明。
  • 使用批处理文件启动 iis express 并进行调用。我用这种方法遇到的问题是我需要能够在测试中进行调试。我尝试附加 visual studio 调试器,但由于某种原因无法正常工作。我一直在断点处收到消息“当前不会命中断点。没有为该文档加载任何符号”。
  • 我还研究了如何以编程方式使用测试 Controller 启动项目,但找不到如何以编程方式启动 visual studio web 项目。 (考虑通过进程和 msbuild 启动它)
  • 目前我正在使用 owin self host 进行测试,但是, Controller 中的 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原因,您可以修改代码以使用 ControllerHttpContext 属性类。

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

相关链接:

关于c# - 如何在调用 httpcontext.current 的 mvc Controller 上进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997919/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com