Ash*_*Ash 5 .net c# tdd asp.net-mvc mocking
我正在尝试找到一种方法将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];
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的一个主要问题是没有IHttpContext,.net http上下文是一个抽象类的子类,不能被模拟(很容易?).
另一个问题是我无法初始化类的全局实例,因为上下文与大多数请求无关.
我可以使类静态,并要求将Context传递给每个函数,因为它被称为ie
public static string GetInstanceVariable(string VariableName, HttpContext Context)
{ ... }
Run Code Online (Sandbox Code Playgroud)
但是这并没有使类更容易测试,我仍然需要创建一个HttpContext,另外任何想要使用这个类的非Web感知服务突然需要能够检索上下文,要求它们紧密耦合到Web服务器 - 首先想要创建这个类的全部原因.
我对所有建议持开放态度 - 特别是那些人们知道的便于进行tdd测试的建议.人们会怎么建议我解决这个问题?
干杯
这就是引入 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];
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2209 次 |
| 最近记录: |