c#如何获取httpResponse.BinaryWrite处理的流

时间:2012-12-18 14:20:48

标签: asp.net httpresponse nmock

我有以下方法在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对象中读取流?

1 个答案:

答案 0 :(得分:2)

我有两个想法......一个是模拟HttpResponse,另一个是模拟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窗体的几个链接。

Can I run a ASPX and grep the result without making HTTP request?

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