加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 21:02:31 所属栏目:asp.Net 来源:网络整理
导读:我想编写一个单元测试来测试一个名为UploadedFile的类的功能. 我面临的问题是这个类的静态构造函数使用HttpContext.Current属性,因为我从类库运行我的单元测试,我在测试时没有HttpContext. 看看我的静态构造函数: static UploadedFile(){ if (HttpContext.C
我想编写一个单元测试来测试一个名为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不会为null,我可以成功设置它:

HttpServerUtility server = HttpContext.Current.Server;

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读