2012-12-18 9 views
5

Ho il seguente metodo che scrive uno stream in un oggetto HttpResponse.C# come ottenere uno stream elaborato da httpResponse.BinaryWrite

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; 

    } 

Per testarlo, ho bisogno di recuperare il flusso elaborato. C'è qualche modo per leggere il flusso dall'oggetto httpResponse?

+0

Mock un HttpResponseBase. – SLaks

+0

è httpResponse dichiarato al di fuori di questo metodo? –

+0

@betogrun: quale framework di derisione utilizzi per i test? –

risposta

2

Ho due idee ... una per deridere HttpResponse e l'altra per simulare un server web.

1. beffardo HttpResponse

ho scritto questo prima di sapere che beffardo quadro è stato utilizzato. Ecco come puoi testare il tuo metodo usando TypeMock.

questo presuppone che si passa la variabile HttpResponse al metodo, cambiando il metodo come segue:

public void ShowPDF(Stream stream, HttpResponse httpResponse) 

Naturalmente si cambierebbe questo per passarlo a una proprietà sul vostro oggetto pagina, invece, se si tratta di un membro della tua classe Page.

Ed ecco un esempio di come si potrebbe provare con un HttpResponse falso:

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. simulare un server Web

forse si può fare questo simulando un server web. Potrebbe sembrare folle, ma non sembra che sia così tanto codice. Qui ci sono un paio di link su come eseguire Web Form al di fuori di IIS.

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

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

+0

Grazie per la risposta Lost Hobbit, ma non posso usare TypeMock. L'unica framowemork approvata che posso usare è NMock. – betogrun

+1

@betogrun Peccato ... forse tagga il tuo post con NMock ... forse un esperto NMock lo troverà. –

+0

Sicuro! Ho appena modificato il post. Cercherò di applicare il tuo esempio usando NMock Grazie! – betogrun

Problemi correlati