2012-06-19 44 views
1

我试图为依赖于HttpContext对象的几个方法编写一些单元测试。我已经提出了以下课程,但我不认为它是最好的方式。单元测试Webform 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); 
    } 

有没有实现这一个更好的方式,什么时候我开始添加更多的虚拟那将是更清洁数据。

回答

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; 
    ... 
}