2010-08-13 3 views
6

Je veux écrire un test unitaire qui teste la fonction d'une classe appelée UploadedFile. Le problème auquel je suis confronté est que le constructeur statique de cette classe utilise la propriété HttpContext.Current et parce que j'exécute mon test unitaire à partir d'une bibliothèque de classes, je n'ai pas de HttpContext au moment du test.Comment rendre HttpContext disponible pour mes tests unitaires?

Regardez mon constructeur statique:

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

Que dois-je faire dans mon environnement de test afin que HttpContext.Current ne sera pas nul et que je peux mettre avec succès ceci:

HttpServerUtility server = HttpContext.Current.Server; 

Répondre

10

Vous shouldn » t utiliser HttpContext.Current directement dans votre fonction car il est presque impossible de tester un appareil, comme vous l'avez déjà découvert. Je vous suggère d'utiliser HttpContextBase à la place, qui est passé soit dans le constructeur de votre classe, soit en tant qu'argument de la méthode que vous testez. Cela permettra aux consommateurs de cette classe de passer un vrai HttpContextWrapper et dans votre test unitaire, vous pouvez vous moquer des méthodes dont vous avez besoin.

Par exemple, voici comment vous pouvez appeler la méthode:

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

Et dans votre test unitaire (en utilisant Rhino Mocks):

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

Ou, si vous préférez, utilisez Constructor Injection.

+0

Merci pour l'idée! Je n'ai pas utilisé Rhino.Mocks.dll jusqu'ici malheureusement. Il semble que je dois d'abord me familiariser avec lui puis je vais essayer de mettre en œuvre votre suggestion. Merci! – pencilCake