5

HttpResponseオブジェクトにストリームを書き込む次のメソッドがあります。

public HttpResponse ShowPDF(Stream stream)
    {
        MemoryStream memoryStream = (MemoryStream) stream;

        httpResponse.Clear();
        httpResponse.Buffer = true;
        httpResponse.ContentType = "application/pdf";
        httpResponse.BinaryWrite(memoryStream.ToArray());
        httpResponse.End();

        return httpResponse;

    }

それをテストするには、処理されたストリームを回復する必要があります。httpResponseオブジェクトからストリームを読み取る方法はありますか?

4

1 に答える 1

2

私には2つのアイデアがあります...1つはHttpResponseをモックすることで、もう1つはWebサーバーをシミュレートすることです。

1.HttpResponseをあざける

どのモックフレームワークを使用しているかを知る前に、これを書きました。TypeMockを使用してメソッドをテストする方法は次のとおりです。

これは、httpResponse変数をメソッドに渡し、メソッドを次のように変更することを前提としています。

public void ShowPDF(Stream stream, HttpResponse httpResponse)

もちろん、Pageクラスのメンバーである場合は、これをPageオブジェクトのプロパティに渡すように変更します。

そして、偽のHttpResponseを使用してテストする方法の例を次に示します。

internal void TestPDF()
{
    FileStream fileStream = new FileStream("C:\\deleteme\\The Mischievous Nerd's Guide to World Domination.pdf", FileMode.Open);
    MemoryStream memoryStream = new MemoryStream();
    try
    {
        memoryStream.SetLength(fileStream.Length);
        fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length);

        memoryStream.Flush();
        fileStream.Close();

        byte[] buffer = null;

        var fakeHttpResponse = Isolate.Fake.Instance<HttpResponse>(Members.ReturnRecursiveFakes);
        Isolate.WhenCalled(() => fakeHttpResponse.BinaryWrite(null)).DoInstead((context) => { buffer = (byte[])context.Parameters[0]; });

        ShowPDF(memoryStream, fakeHttpResponse);

        if (buffer == null)
            throw new Exception("It didn't write!");
    }
    finally
    {
        memoryStream.Close();
    }        
}

2.Webサーバーをシミュレートします

おそらく、Webサーバーをシミュレートすることでこれを行うことができます。クレイジーに聞こえるかもしれませんが、それほど多くのコードではないようです。IISの外部でWebフォームを実行することに関するいくつかのリンクを次に示します。

HTTPリクエストを行わずにASPXを実行して結果をgrepできますか?

http://msdn.microsoft.com/en-us/magazine/cc163879.aspx

于 2012-12-18T16:15:31.363 に答える