2010-08-13 17 views
6

Quiero escribir una prueba unitaria que pruebe la función de una clase llamada UploadedFile.¿Cómo puedo hacer que HttpContext esté disponible para ser utilizado por mis Pruebas Unitarias?

El problema al que me enfrento es que el constructor estático de esta clase utiliza la propiedad HttpContext.Current y como estoy ejecutando mi prueba unitaria desde una biblioteca de clases, no tengo un HttpContext en el momento de la prueba.

Look at my constructor estático:

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

¿Qué debo hacer en mi entorno de pruebas para que HttpContext.Current no será nulo y que puede establecer con éxito este:

HttpServerUtility server = HttpContext.Current.Server; 

Respuesta

10

No deberías t use HttpContext.Current directamente en su función, ya que es casi imposible probar la unidad, como ya ha descubierto. En su lugar, le sugiero que use HttpContextBase, que se pasa en el constructor de su clase o como un argumento para el método que está probando. Esto permitirá que los consumidores de esta clase pasen un HttpContextWrapper real y en su prueba de unidad puede burlarse de los métodos que necesita.

Por ejemplo, aquí es cómo se puede llamar al método:

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

Y en su unidad de prueba (utilizando Rhino Mocks):

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

O, si lo prefiere, utilice Constructor Injection.

+0

¡Gracias por la idea! No he usado Rhino.Mocks.dll hasta ahora, por desgracia. Parece que tengo que familiarizarme con esto primero y luego intentaré implementar tu sugerencia. ¡Gracias! – pencilCake

Cuestiones relacionadas