2010-12-29 34 views
6

Tôi đang cố gắng tạo các kiểm tra đơn vị cho một số mã cũ. Một trong những lớp học mà tôi phải kiểm tra được gọi là FileDownloader trong đó có chỉ là một phương pháp sau đây:Chế nhạo HTTPResponse trong một thử nghiệm đơn vị

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

tôi không được phép để cấu trúc lại mã này (lẽ ra là lý tưởng!).

Để kiểm tra này, tôi quyết định tạo ra một HttpContext giả dựa trên các bài viết dưới đây

Click this

Với điều này tôi có thể có được một giả HttpContext trong khi thực hiện thử nghiệm của tôi, tuy nhiên có những vấn đề với giả mạo HttpResponse.

Đây là cách thử nghiệm của tôi trông giống như:

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

Tôi đang đi qua một tùy chỉnh được tạo HttpResponse đối tượng để phương pháp này. Điều này ném ngoại lệ sau khi nó chạm vào dòng "response.BinaryWrite (content)":

System.Web.HttpException: OutputStream không khả dụng khi sử dụng TextWriter tùy chỉnh.

Tôi không chắc mình nên khẳng định chính xác điều gì ở đây .. do đó không có xác nhận nào trong thử nghiệm. Đây có phải là cách chính xác để kiểm tra phương pháp này ... bất kỳ ý tưởng nào. xin vui lòng tư vấn cho?

Cảm ơn

Trả lời

4

Một cách khác để thử nghiệm nó đang sử dụng các lớp cơ sở trừu tượng như HttpContextBase, HttpResponseBase vv http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase(v=VS.90).aspx

HttpContextBase là một phần của .NET 3.5 SP1, .NET 4.0 và có thể được cài đặt như một gói riêng cho .NET 2.0. Khi tôi đang thử nghiệm tải lên/tải xuống trình xử lý có tính năng đã xuất hiện một biện pháp khắc phục cho tôi :-).

Cách sử dụng rất đơn giản. Phương pháp này sẽ được kiểm tra.

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

Đối với bối cảnh thực bạn chỉ có thể tạo ra một sơ khai và đại biểu đến phương pháp kiểm chứng, như:

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

Cảm ơn tất cả .. Thật sự tôi cần phải có được bằng cách sử dụng phản ứng của giả HttpContext rằng Tôi đã tạo .. thay vì tạo đối tượng Phản hồi mới:

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

tác phẩm này !!!!

Các vấn đề liên quan