2010-08-13 4 views
6

Ich möchte einen Komponententest schreiben, der die Funktion einer Klasse namens UploadedFile testet.Wie kann ich HttpContext verfügbar machen, um von meinen Unit Tests verwendet zu werden?

Das Problem, dem ich gegenüberstehe, ist der statische Konstruktor der Klasse, der die HttpContext.Current-Eigenschaft verwendet und weil ich meinen Unit-Test von einer Klassenbibliothek aus führe, habe ich zum Testzeitpunkt keinen HttpContext.

Sehen Sie sich meine statischen Konstruktor:

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);   
} 

Was soll ich in meiner Testumgebung tun, damit HttpContext.Current nicht null sein wird, und ich kann dies erfolgreich gesetzt:

HttpServerUtility server = HttpContext.Current.Server; 

Antwort

10

Sie shouldn‘ t verwenden Sie HttpContext.Current direkt in Ihrer Funktion, da es fast unmöglich ist, Unit-Test, wie Sie bereits herausgefunden haben. Ich würde vorschlagen, dass Sie stattdessen HttpContextBase verwenden, das entweder im Konstruktor Ihrer Klasse oder als Argument für die Methode, die Sie testen, übergeben wird. Dies ermöglicht es den Verbrauchern dieser Klasse, eine echte HttpContextWrapper zu übergeben und in Ihrem Komponententest können Sie die Methoden verspotten, die Sie benötigen.

Zum Beispiel ist hier, wie Sie die Methode nennen könnte:

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

Und in Ihrem Unit-Test (mit Rhino Mocks):

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

Oder, wenn Sie es vorziehen, verwenden Constructor Injection.

+0

Danke für die Idee! Ich habe die Rhino.Mocks.dll bisher leider nicht benutzt. Es scheint, dass ich mich zuerst damit vertraut machen muss, dann werde ich versuchen, Ihren Vorschlag umzusetzen. Vielen Dank! – pencilCake

Verwandte Themen