Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c# how to get a stream processed by httpResponse.BinaryWrite

I have the following method that writes a stream in a HttpResponse object.

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;

    }

In order to test it, I need to recover the processed stream. Is there someway to read the stream from the httpResponse object?

like image 871
betogrun Avatar asked Nov 03 '22 08:11

betogrun


1 Answers

I have two ideas... one to mock the HttpResponse, and the other is to simulate a web server.

1. Mocking HttpResponse

I wrote this before I knew which mocking framework you used. Here's how you could test your method using TypeMock.

This assumes that you pass your httpResponse variable to the method, changing the method as follows:

public void ShowPDF(Stream stream, HttpResponse httpResponse)

Of course you would change this to passing it to a property on your Page object instead, if it is a member of your Page class.

And here's an example of how you could test using a fake 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. Simulate a Web Server

Perhaps you can do this by simulating a web server. It might sound crazy, but it doesn't look like it's that much code. Here are a couple of links about running Web Forms outside of IIS.

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

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

like image 145
Stephen Oberauer Avatar answered Nov 15 '22 07:11

Stephen Oberauer