单元测试Webform HttpContext依赖代码?

时间:2012-06-19 16:11:00

标签: c# asp.net unit-testing

我试图为几个依赖于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);
    }

有没有更好的方法来实现这一点,当我开始添加更多虚拟数据时会更清晰。

2 个答案:

答案 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/