7

我一直在 ASP.NET 中以某种方式伪造/模拟/存根 HttpContext(在 ASP.NET MVC/MonoRail 中更容易)。

但是我可以看到 HttpContext 本身可以很容易地构建,实际上只需几行代码。

var tw = new StringWriter();
var workerReq = new SimpleWorkerRequest("/webapp", @"c:\here\there\wwwroot", "page.aspx", tw);
var context = new HtpContext(workerReq);

如果我们将这段代码包装成这样的东西,它应该可以正常工作,也许我们甚至可以使用它来渲染 ASPX:

using(Simulate.HttpContext()) {
  HttpContext.Current.BlaBla;
}

所以问题是:

  1. 不应该这样做的原因。
  2. 应该这样做的原因。
  3. 为什么它没有被广泛使用(事实上我不记得任何关于它的帖子)。

我记得 Phill Haack 使用反射黑客构造 HttpContext 的一篇文章。
但似乎它只是不需要。

干杯,
德米特里。

4

3 回答 3

5

进行非常简单的测试很好,但是如何对使用 HttpRequest.Files 的组件进行单元测试?据我所知,没有公共 API 允许您在 SimpleWorkerRequest 上指定它。即使您可以找到可以设置 HttpFileCollection 属性的位置,请注意其构造函数是内部的,因此您甚至无法创建该类型的实例。

HttpRequest.Files 在这方面并不孤单,事实上,您无法使用当前 HttpContext 实现测试的东西可能比您可以测试的要多得多。这是抽象真正派上用场的地方。

于 2009-11-06T12:35:37.243 回答
2

有几个场景需要考虑。

场景一:您正在进行单元测试。你有一些小东西,比如一个管理对缓存的访问的类,它显式地调用 HttpContent.Cache 。在这种情况下,模拟上下文,这样您就可以看到正在进行的调用,以及它们是否按您期望的方式工作。

场景二:你正在做一个集成测试,你正在尝试测试一些大的东西,比如生成一个复杂的页面。在这种情况下,按照您找到的方式给它真正的 HttpContent 对象。您的集成测试将更好地模拟真实的运行时。

于 2009-11-06T12:34:39.787 回答
0

这可能行得通,但是...

  • 首先,我看到了一些路径,它们在环境中可能会有所不同。
  • 其次,它是否需要安装 IIS 之类的东西?
  • 创建它需要多少时间?如果我有 100 个测试需要它并且需要 1 秒,那么这意味着我的测试运行大约一分钟或更长时间,这会导致开发人员运行测试的时间更少。
  • 您如何轻松地模拟/设置缓存、请求等来创建测试场景?

模拟/存根可能更容易。

编辑

在 Mono 项目中找到了一些 HttpContext 和 SimpleWorkerRequest 的源代码:

这些可以更好地洞察创造中正在发生的事情。

发现一篇文章也可能有帮助:ASP.NET CreateApplicationHost/SimpleWorkerRequest API Hole

这实际上很好地说明了我们需要在应用它们之前了解这些对象中发生了什么,这需要时间。嘲笑似乎更容易。

于 2009-11-06T12:37:05.367 回答