pen*_*ake 6 .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);
}
Run Code Online (Sandbox Code Playgroud)
我应该在我的测试环境中做什么,这样才HttpContext.Current不会为null,我可以成功设置它:
HttpServerUtility server = HttpContext.Current.Server;
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 10
您不应该HttpContext.Current直接在您的函数中使用,因为您已经发现了几乎不可能进行单元测试.我建议您使用HttpContextBase,它可以在您的类的构造函数中传递,也可以作为您正在测试的方法的参数传递.这将允许此类的使用者传递真正的HttpContextWrapper,并且在您的单元测试中,您可以模拟所需的方法.
例如,您可以调用该方法:
var wrapper = new HttpContextWrapper(HttpContext.Current);
Foo.UploadedFile(wrapper);
Run Code Online (Sandbox Code Playgroud)
在你的单元测试中(使用Rhino Mocks):
var contextMock = MockRepository.GenerateMock<HttpContextBase>();
// TODO: Define expectations on the mocked object
Foo.UploadedFile(contextMock);
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意,请使用构造函数注入.
| 归档时间: |
|
| 查看次数: |
3562 次 |
| 最近记录: |