如果可以构造,为什么要模拟HttpContext?

Dmy*_*iak 7 asp.net testing asp.net-mvc mocking httpcontext

我总是在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);
Run Code Online (Sandbox Code Playgroud)

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

using(Simulate.HttpContext()) {
  HttpContext.Current.BlaBla;
}
Run Code Online (Sandbox Code Playgroud)

所以问题是:

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

我记得Phill Haack使用Reflection hacks构建HttpContext的帖子.
但它似乎并不需要.

干杯,
德米特里.

Lev*_*evi 5

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

HttpRequest.Files是不是一个人在这方面,事实上有可能大大更多的东西,你不能用当前的HttpContext实现比你测试可以测试.这就是抽象真正派上用场的地方.