我试图为几个依赖于HttpContext对象的方法编写一些单元测试。我提出了以下课程,但我不认为这是最好的方法。
internal class HttpContextMocking
{
public static HttpContext Context()
{
HttpContext context = new HttpContext(new SimpleWorkerRequest("", "", "", null, new StringWriter()));
context.Cache.Insert("SomeName", "value", null, DateTime.Now.AddMinutes(3), TimeSpan.Zero);
return context;
}
然后我按照以下方式在单元测试中调用这个模拟HttpContext:
[TestMethod]
[TestCategory("Web")]
public void Get()
{
HttpContext.Current = HttpContextMocking.Context();
object result = CacheUtility.Get("NonExistentItem");
Assert.IsNull(result);
}
有没有更好的方法来实现这一点,当我开始添加更多虚拟数据时会更清晰。
答案 0 :(得分:1)
HttpContext非常复杂。我建议将依赖项更改为提供所需内容的接口,然后有两个实现:一个实现,使用HttpContext和一个模拟测试。
如果你想要嘲笑它并且你的代码可以解决问题,那么就这样做吧。
另一种选择是使用MSTest的ASP.NET主机类型。在这种情况下,您将执行实际请求,您的HttpContext将在那里:
[TestMethod]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost(@"$(SolutionDir)\Tests", "/")]
[UrlToTest("http://localhost:1234/TestPage.aspx")]
public void MyTest()
{
Page page = testContextInstance.RequestedPage;
...
}
答案 1 :(得分:1)
HttpContextWrapper和HttpContextBase .NET类是为了模拟目的而创建的,例如http://www.codemerlin.com/2011/07/mocking-httpcontext-httpresponse-httprequest-httpsessionstate-etc-in-asp-net/