【问题标题】:How can I make HttpContext available to be used by my Unit Tests?如何使 HttpContext 可供我的单元测试使用?
【发布时间】:2011-03-29 08:49:30
【问题描述】:

我想编写一个单元测试来测试一个名为 UploadedFile 的类的功能。

我面临的问题是这个类的静态构造函数使用 HttpContext.Current 属性,并且因为我正在从类库运行我的单元测试,所以在测试时我没有 HttpContext。

看看我的静态构造函数:

static UploadedFile()
{
    if (HttpContext.Current == null)
        throw new Exception("web server not available");

    HttpServerUtility server = HttpContext.Current.Server;

    // SET UploadedFileMappingFile Names:
    _resourceFileNames = new StringDictionary();

    _resourceFileNames[_suppoertedFileStructures] = server.MapPath(SupportedUploadedFileStructures);
    _resourceFileNames[_supportedFileStructuresXSD] = server.MapPath(SupportedUploadedFileStructuresXSD);

    _resourceFileNames[UploadedFileEnum.UploadedFileFormatENUM.CSV.ToString()] = server.MapPath(UploadedFileColumnMap);        
}

我应该在我的测试环境中做什么,以使HttpContext.Current 不会为空并且我可以成功设置:

 HttpServerUtility server = HttpContext.Current.Server;

【问题讨论】:

    标签: .net asp.net unit-testing httpcontext httpserverutility


    【解决方案1】:

    您不应该直接在您的函数中使用HttpContext.Current,因为您已经发现几乎不可能进行单元测试。我建议您改用HttpContextBase,它可以在您的类的构造函数中传递,也可以作为您正在测试的方法的参数传递。这将允许这个类的消费者传递一个真正的HttpContextWrapper,并且在你的单元测试中你可以模拟你需要的方法。

    例如,您可以通过以下方式调用该方法:

    var wrapper = new HttpContextWrapper(HttpContext.Current);
    Foo.UploadedFile(wrapper);
    

    在你的单元测试中(使用Rhino Mocks):

    var contextMock = MockRepository.GenerateMock<HttpContextBase>();
    // TODO: Define expectations on the mocked object
    Foo.UploadedFile(contextMock);
    

    或者,如果您愿意,可以使用Constructor Injection

    【讨论】:

    • 感谢您的建议!不幸的是,到目前为止我还没有使用过 Rhino.Mocks.dll。看来我必须先熟悉它,然后我会尝试实施您的建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多