2010-12-29 28 views
6

Bazı eski kodlar için birim testleri oluşturmaya çalışıyorum. Sadece izleyen bir yöntem olan FileDownloader denir test etmek zorunda sınıfların biri:Bir birim testinde HTTPResponse alay Etme

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

Bu kodu refactor izin yok (ideal olurdu!). Bunu test etmek için

Ben benim test yürütme sırasında sahte HttpContext elde edebilmek olduğum Bununla

Click this

Aşağıdaki makalede dayalı sahte HttpContext oluşturmaya karar, ancak taklit ile sorunları vardır HttpResponse.

İşte benim test benziyor açıklanmıştır:

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

Ben yönteme oluşturulan özel bir HTTPResponse nesne geçiyordum. Bu, "response.BinaryWrite (content)" satırı:

System.Web.HttpException: Özel bir TextWriter kullanıldığında OutputStream kullanılamaz. Burada tam olarak neyin doğru olduğunu bilmem gerektiğinden emin değilim .. bu nedenle testte hiç bir iddia yoktur. Bu yöntemi test etmenin doğru yolu budur ... herhangi bir fikir. tavsiye lütfen ?

Teşekkür

Projemde

cevap

4

bunu test etmenin bir başka yolu http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase(v=VS.90).aspx

vb HttpContextBase, HttpResponseBase gibi soyut temel sınıflar kullanıyor

HttpContextBase, .NET 3.5 SP1, .NET 4.0'ın bir parçasıdır ve .NET 2.0 için ayrı bir paket olarak yüklenebilir. Ben bu özellik yükleme/indirme handlers test ederken ben benim için bir çare oldu.

Kullanım basittir. Bu yöntem testle karşılanacaktır. Eğer sadece bir saplama oluşturmak ve benzeri test edilebilir yönteme yetki verebilir gerçek içerik için

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

:

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

teşekkür hepsi .. Aslında sahte Response kullanarak olmalıydı HttpContext Ben .. yerine yeni Response nesnesi oluşturma yaratmıştı o:

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

!!!!

İlgili konular