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

bet*_*run 5 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;

    }
Run Code Online (Sandbox Code Playgroud)

为了测试它,我需要恢复处理过的流.有没有办法从httpResponse对象读取流?

Ste*_*uer 2

我有两个想法...一个是模拟 HttpResponse,另一个是模拟 Web 服务器。

1. 模拟HttpResponse

我在知道你使用哪个模拟框架之前就写了这篇文章。以下是如何使用 TypeMock 测试您的方法。

这假设您将 httpResponse 变量传递给该方法,并按如下方式更改该方法:

public void ShowPDF(Stream stream, HttpResponse httpResponse)
Run Code Online (Sandbox Code Playgroud)

当然,如果它是 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();
    }        
}
Run Code Online (Sandbox Code Playgroud)

2. 模拟Web服务器

也许您可以通过模拟 Web 服务器来做到这一点。这听起来可能很疯狂,但看起来并没有那么多代码。这里有一些关于在 IIS 之外运行 Web 窗体的链接。

我可以运行 ASPX 并 grep 结果而不发出 HTTP 请求吗?

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