Pregunta

Quiero escribir una prueba unitaria que pone a prueba la función de una clase llamada UploadedFile.

La cara problema que es esta clase usos constructor estático HttpContext.Current propiedad y porque estoy corriendo mi unidad de prueba de una biblioteca de clases que no tienen un HttpContext en el tiempo de 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;
¿Fue útil?

Solución

No debe utilizar HttpContext.Current directamente en su función, ya que es casi imposible de probar la unidad, como ya has descubierto. Yo sugeriría que el uso de HttpContextBase lugar, que es pasado, ya sea en el constructor de su clase o como un argumento para el método que se está probando. Esto permitirá a los consumidores de esta clase para pasar un verdadero HttpContextWrapper y en su unidad de prueba 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 burla de Rhino ):

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

O, si lo prefiere, utilice Constructor inyección .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top