2010-12-29 37 views
6

私はいくつかのレガシーコード用のユニットテストを作成しようとしています。私は、次の一つの方法を持っているFileDownloaderと呼ばれるテストする必要があり、クラスの 一つは:ユニットテストでHTTPResponseを擬似しました

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

私はこのコードをリファクタリングすることはできませんよ(理想的だったでしょう!)。これをテストする

は私が私のテスト実行中に偽のHttpContextを取得することができるよ。これにより

Click this

以下の記事に基づいて偽のHttpContextを作成することを決めた、しかし偽造に問題がありますHttpResponse。

は、ここに私のテストがどのように見えるかです:

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

は、私が法に作成したカスタムHTTPResponseはオブジェクトを渡しています。 "response.BinaryWrite(content)"行にヒットした場合、次の例外がスローされます。

System.Web.HttpException:カスタムTextWriterが使用されている場合、OutputStreamは使用できません。

ここに私が正確に何を言わなければならないのかわかりません。したがって、テストには何の主張もありません。 これは、この方法をテストする正しい方法です...アイデア。お知らせ下さい ?

おかげで、我々はsuccesslyそのような目的のためにHttpSimulatorを使用している私のプロジェクトで

答えて

4

HttpContextBase、HttpResponseBaseのような抽象基底クラスを使用して、それをされてテストする別の方法を、など http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase(v=VS.90).aspx

HttpContextBaseは.NET 3.5 SP1、.NET 4.0の一部であり、.NET 2.0用の個別のパッケージとしてインストールできます。 ハンドラのアップロード/ダウンロードをテストしているときに、その機能が私の救済策になっていました:-)。

使い方は簡単です。この方法はテストでカバーされます。あなただけのように、検証可能な方法にスタブと、デリゲートを作成することができ、実際の状況については

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

おかげで、すべての... 実は私は偽のHttpContextの応答を使用している必要があります私は...代わりに新しいResponseオブジェクトを作成する作成した こと:

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

!!!!

関連する問題