6

我正在尝试找出一种将 Web 当前 http 上下文传递给服务类(或使用对它的引用来初始化类)的方法。我这样做是为了将应用程序的其余部分从需要了解有关 http 上下文的任何信息中抽象出来。

我还希望该服务可以使用 TDD 进行测试,可能使用 Mockable 框架之一。因此,最好使用接口而不是实际的类。

我想实现的一个例子:

class WebInstanceService 
{
    private IHttpContext _Context;        

    public WebInstanceService( ... , IHttpContext HttpContext )
    {
        ....
        _Context = HttpContext;
    }

    // Methods...
    public string GetInstanceVariable(string VariableName)
    {
         return _Context.Current.Session[VariableName];
    }
}

我遇到的主要问题之一是没有 IHttpContext,.net http 上下文是无法模拟的抽象类的子类(容易吗?)。

另一个问题是我无法初始化类的全局实例,因为上下文与大多数请求无关。

我可以使类静态,并要求将上下文传递给每个函数,因为它被称为即

public static string GetInstanceVariable(string VariableName, HttpContext Context) 
{ ... }

但这并没有使这个类更容易测试,我仍然需要创建一个 HttpContext 并且另外任何想要使用这个类的非 Web 感知服务突然需要能够检索要求它们紧密耦合的 Context到网络服务器——首先想要创建这个类的全部原因。

我对所有建议持开放态度——尤其是那些人们知道有助于轻松进行 tdd 测试的建议。人们会建议我如何解决这个问题?

干杯

4

3 回答 3

3

这就是引入 HttpContextBase 和 HttpContextWrapper 的原因。您可能想要使用 HttpContextBase 并在传递真实上下文时使用new HttpContextWrapper( httpContext ),但是,我认为控制器中可用的内容已经是 HttpContextBase 类型。我每次都会在我的控制器中创建其中一个,而不是尝试从静态的全局 HttpContext.Current 实例中引用当前上下文。如果您在视图中需要它,请在 ViewData 中传递对强类型上下文的引用。

我在测试中经常模拟 HttpContextBase。

class WebInstanceService 
{
    private HttpContextBase _Context;        

    public WebInstanceService( ... , HttpContextBase HttpContext )
    {
        ....
        _Context = HttpContext;
    }

    // Methods...
    public string GetInstanceVariable(string VariableName)
    {
         return _Context.Session[VariableName];
    }
}
于 2008-12-02T13:10:27.837 回答
1

我们所做的是旋转其中一个http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

就像馅饼一样简单,只需实例化一个 HttpSimulator 并填写值,然后 HttpContext.Current 就会填满您指定的任何内容。

IHttpContext 是 MVC 中的东西,显然有一天会出现在 webforms 中。希望那一天将是.net 4

于 2008-12-02T13:11:14.107 回答
1

ASP.NET 附带包含 HttpContextBase 的 System.Web.Abstractions,您可以使用它在测试情况下处理 HttpContext。

我个人会抽象出对 HttpContext 的直接依赖。

于 2008-12-02T13:12:41.700 回答