2010-12-29 14 views
6

Estoy intentando crear pruebas unitarias para algún código heredado. Una de las clases que tengo que probar se llama FileDownloader que tiene sólo el método siguiente:Mocking HTTPResponse en una prueba de unidad

public void Transmit(string fileName, HttpResponse response, DownloadFileType fileType, byte[] content) 
{ 
    response.Clear(); 
    response.ClearHeaders(); 
    response.ContentType = "application/xls"; 
    response.AddHeader("content-disposition", "attachment; filename=" + HttpContext.Current.Server.UrlEncode(fileName)); 
    response.BinaryWrite(content); 
    response.End(); 
    response.Flush(); 
} 

no se me permite refactorizar el código (que habría sido ideal!).

Para probar esto decidí crear una falsa HttpContext basado en el artículo siguiente

Click this

con esto que soy capaz de obtener un falso HttpContext durante mi ejecución de la prueba, sin embargo, hay problemas con la falsificación la respuesta de Http.

Así es como mi prueba se parece a:

[SetUp] 
public void SetUp() 
{ 
    mocks = new MockRepository();    
    FakeHttpContext.CreateFakeHttpContext(); 
} 

[Test] 
public void ShouldTransmitHttpResponseInTheSpecifiedFormat() 
{ 
    FileDownloader downloader = new FileDownloader(); 
    string path = "..\\..\\Fakes\\DummyDownloadReportsTemplate.xls"; 
    byte[] bytes = ReadByteArrayFromFile(path); 
    downloader.Transmit("test.xls", new HttpResponse(new StringWriter()), DownloadFileType.Excel, bytes); 
} 

estoy pasando un objeto personalizado creado HTTPResponse al método. Esto arroja la siguiente excepción cuando toca la línea "response.BinaryWrite (content)":

System.Web.HttpException: OutputStream no está disponible cuando se utiliza un TextWriter personalizado.

No estoy seguro de qué es exactamente lo que debo afirmar aquí ... por lo tanto, no hay afirmaciones en la prueba. ¿Es esta la forma correcta de probar este método ... alguna idea? por favor avise ?

Gracias

Respuesta

4

Otra forma de probar que es el uso de clases base abstractas como HttpContextBase, HttpResponseBase, etc. http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase(v=VS.90).aspx

HttpContextBase es una parte de .NET 3.5 SP1, .NET 4.0 y se puede instalar como un paquete separado para .NET 2.0. Cuando estaba probando la carga/descarga de controladores esa característica me pareció un remedio :-).

El uso es simple. Este método será cubierto con prueba.

public void Transmit(string fileName, HttpResponseBase response, DownloadFileType fileType, byte[] content) 
{ 
... 
// main logic. 
... 
} 

Para el contexto real sólo puede crear un talón y delegar en el método comprobable, como:

public void Transmit(string fileName, HttpResponse response, DownloadFileType fileType, byte[] content) 
{ 
    var requestWrapper = new HttpResponseWrapper(response); 
    this.Transmit(fileName, requestWrapper, fileType, content); 
} 
0

Gracias a todos .. En realidad debería haber estado usando la respuesta de la falsa HttpContext que yo había creado .. en lugar de crear un nuevo objeto Respuesta:

downloader.Transmit("test.xls", HttpContext.Current.Response, DownloadFileType.Excel, bytes); 

esto funciona !!!!