更新 #1:
尽管我的原始答案在编写使用HttpContext
某些方面的测试时可能很有用,但是要与HttpContext.Application
属性一起使用并不容易,因为该属性依赖于HttpApplicationFactory
类的static internal
属性。
一个可能的解决方案是不要在测试方法中依赖Application
属性,而是将值传递到方法中。例如:
cls.MethodUnderTest("foo value");
这意味着您可以更改测试类,使其不依赖于HttpContext.Application(假设没有其他测试需要它),您的测试类将仅包含以下测试内容:
[TestMethod]
public void Test1()
{
object fooValue = <some value>;
YourClassName cls = new YourClassName();
cls.MethodUnderTest(fooValue);
}
如果您有其他测试需要使用不同的值测试该方法,则可以创建一个测试并传递该值,而无需首先添加到
HttpContext.Application
中。
顺便说一下... ...在打这段话的时候,我已经意识到我可能可以用我的单元测试和cookies做同样的事情!
原始答案:
我正在尝试类似的事情,但是使用cookies。 我是将
HttpContext.Current
传递到类中,存储一个引用,然后在类方法中使用它。
public class MyClass
{
private HttpContext _httpContext;
public MyClass(HttpContext httpContext) {
_httpContext = httpContext;
}
public void SomeMethod() {
...
...
}
}
关于单元测试,我会像你现在所做的那样做类似的事情:
public void Test1()
{
HttpRequest request = new HttpRequest(null, "http://tempuri.org", null);
HttpResponse response = new HttpResponse(null);
HttpContext httpContext = new HttpContext(request, response);
httpContext.Request.Cookies.Add(new HttpCookie("cookieName"));
MyClass cls = new MyClass(httpContext);
cls.SomeMethod();
}
针对您的情况,您可以更改引用
HttpContext.Current
的类,使其接受一个
HttpContext
实例,并将
HttpContext.Current
传递给它,就像上面的示例一样。然后,您不需要在
TestInitialize
中设置
HttpContext.Current
,而是创建一个成员变量并使用它,而不依赖于静态的
Current
属性。
例如:
private const string Foo = "foobar";
private HttpContext _httpContext = null;
[TestInitialize]
public void InitializeContext()
{
_httpContext = new HttpContext(new HttpRequest(
null, "http://tempuri.org", null), new HttpResponse(null));
_httpContext.Application["fooKey"] = Foo;
}
[TestMethod]
public void Test1() <-- **** Example Test Method ****
{
YourClassName cls = new YourClassName(_httpContext);
cls.MethodUnderTest();
}
[TestCleanup]
public void DisposeContext()
{
_httpContext = null;
}
我手头没有一个可用的示例,所以目前只能凭记忆来解释,但希望它能提供一些帮助。
MyClass
中检索它会导致null
。 - arnaudoff