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