我已经准备好HttpRequest的Fake对象(包装器和接口)...因为我不需要调用构造函数,如何在不破坏此方法的接口的情况下传递假的HttpRequest?
public static int ParseQueryInt(string key, int defaultValue)
{
NameValueCollection nvc;
if (HttpContext.Current.Request.QueryString["name"] != null)
{
//Parse strings.
}
}
编辑:Akselson的解决方案是最有创意的,这个概念证明有效,令我惊讶的是,虽然我也使用了Skeet的解决方案,因为它看起来更有可能适用于所有情况。
public class Class1
{
[Test]
public void Test()
{
HttpContext.Current = new HttpContext(
new HttpRequest("test.aspx", "http://test.com/test.aspx", "querystring=value"),
new HttpResponse(new StringWriter())
);
Assert.AreEqual(HttpContext.Current.Request.QueryString["querystring"], "value");
}
}
答案 0 :(得分:7)
一个选择是引入另一个重载:
public static int ParseQueryInt(string key, int defaultValue)
{
return ParseQuery(key, defaultValue, HttpContext.Current.Request);
}
public static int ParseQueryInt(string key, int defaultValue,
HttpRequest request)
{
NameValueCollection nvc;
if (request.QueryString["name"] != null)
{
//Parse strings.
}
}
然后,您将“不可测试”(或至少“难以测试”)代码简化为简单重定向...您可以测试接受请求的版本。
答案 1 :(得分:4)
您可以将HttpContext.Current设置为您自己的实例:
HttpContext.Current = new HttpContext(
new HttpRequest("test.aspx","http://test.com/test.aspx","querystring=value"),
new HttpResponse(new StringWriter())
);
如果您不想在测试之前更改方法,可能会有用。