2010-12-29 19 views
6

Próbuję utworzyć testy jednostkowe dla niektórych starszych kodów. jednej z klas, które mam do przetestowania nazywa FileDownloader który ma tylko jeden sposób następujący:Prześmiewanie HTTPResponse w teście jednostkowym

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

Nie wolno mi byłaby ten kod (który byłby idealny!).

Aby to sprawdzić postanowiłem stworzyć fałszywy HTTPContext na podstawie artykułu poniżej

Click this

Z tego jestem w stanie uzyskać fałszywe HTTPContext podczas mojego wykonania testu, jednak istnieją problemy z preparowania HttpResponse.

Oto jak wygląda mój testu:

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

olewam zwyczaj utworzony httpResponse obiektu do metody. Powoduje to zgłoszenie następującego wyjątku po wyświetleniu wiersza "response.BinaryWrite (content)":

System.Web.HttpException: OutputStream nie jest dostępny, gdy niestandardowy TextWriter jest używany.

Nie jestem pewien, co dokładnie powinienem tu potwierdzać, dlatego nie ma żadnych zapewnień w teście. Czy to jest właściwy sposób na przetestowanie tej metody ... jakichkolwiek pomysłów. proszę doradź ?

Dzięki

Odpowiedz

4

Innym sposobem sprawdzenia go używa abstrakcyjnych klas bazowych jak HttpContextBase, HttpResponseBase itp http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase(v=VS.90).aspx

HttpContextBase jest częścią .NET 3.5 SP1, .NET 4.0 i może być instalowany jako osobny pakiet dla .NET 2.0. Kiedy testowałem ładowanie/pobieranie programów obsługi, ta funkcja okazała się dla mnie remedium :-).

Użycie jest proste. Ta metoda zostanie objęta testem.

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

Dla rzeczywistym kontekście można po prostu stworzyć zalążek i przekazać do metody sprawdzalne, jak:

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

dziękuje wszystkim .. Właściwie powinienem był korzystania z odpowiedzią na fałszywe HttpContext że I stworzył .. zamiast tworzenia nowego obiektu Response:

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

to działa !!!!

Powiązane problemy