2010-08-13 33 views
6

我想編寫一個測試稱爲UploadedFile的類的函數的單元測試。如何使HttpContext可供我的單元測試使用?

我面對的問題是這個類的靜態構造函數使用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; 

回答

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

+0

感謝您的想法!不幸的是,我還沒有使用過Rhino.Mocks.dll。看來我必須先熟悉它,然後我會嘗試實施您的建議。謝謝! – pencilCake 2010-08-13 09:25:40

相關問題