Domanda

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?

È stato utile?

Soluzione

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top