如何使单元测试可以使用HttpContext?

时间:2010-08-13 08:58:05

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

我想编写一个单元测试来测试一个名为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;

1 个答案:

答案 0 :(得分:10)

您不应该直接在您的函数中使用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