Question

Je veux écrire un test unitaire qui teste la fonction d'une classe appelée UploadedFile.

Le visage I problème est cette classe utilisations constructeur statiques HttpContext.Current propriété et parce que je courais mon test unitaire à partir d'une bibliothèque de classes que je ne dispose pas d'un HttpContext au moment de l'essai.

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 je peux mettre avec succès ceci:

 HttpServerUtility server = HttpContext.Current.Server;
Était-ce utile?

La solution

Vous ne devriez pas utiliser HttpContext.Current directement dans votre fonction car il est presque impossible de test unitaire, comme vous avez déjà découvert. Je vous suggère l'utilisation HttpContextBase à la place, qui est soit passé dans le constructeur de votre classe ou comme argument à la méthode que vous testez. Cela permettra aux consommateurs de cette classe pour passer un vrai HttpContextWrapper et dans votre test unitaire, vous pouvez railler les 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 d'injection.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top