如何将自定义输入流粘贴到HttpRequest.InputStream中?

时间:2011-01-28 10:00:01

标签: c# unit-testing mocking

MODIFIED:代码使用HttpRequest.InputStream来读取请求主体,解析并存储它。我希望能够对这个课程进行单元测试,但我不能在身体上粘上任何东西。那可能吗?也许我可以以某种方式直接破解A类直接反射并将_body设置为某个值。

ADDED:这是简化设计:

class A
{
  private string _body;
  public string Body { get { return _body; } }

  public A(HttpRequest r)
  {
    {parse r and store data, i.e. query parameter, etc. }
    _body = {read body from r.InputStream };
  }
}

class B
{
  public void ProcessRequest(HttpRequest r)
  {
    var c = new C(r);
    ParseBody(c.Body);
  }
}

这一切都很好,我确实可以测试ParseBody,即使它是私有的。但是,我是A级单元测试,问题出在那里。我可以制作Body R / W属性,但这打破了封装,我讨厌因为A应该是不变的。

3 个答案:

答案 0 :(得分:2)

实现此目标的最佳方法是不直接使用HttpRequest.InputStream

如果您要创建一个获取输入流的服务,您可以让它在生产中返回HttpRequest.InputStream,并为单元测试返回自定义流。

答案 1 :(得分:2)

从外部测试:在本地某处托管脚本,并使用您希望它使用的任何身体调用它。它不是一个单元测试,但是如果你需要一个直接覆盖HttpRequest.InputStream读取的单元测试,可以考虑拆分连接部分和流读取;然后,您可以将流阅读器提供给您喜欢的任何流。

答案 2 :(得分:1)

InputStream是标准的Stream,因此如果您希望单元测试解析器解析内容,您只需要传递一个备用​​Stream。它不一定来自HttpRequest,因为那不是你正在测试的。您正在测试解析是否有效。

如果你必须将它与HttpRequest结合,那么看一下HttpRequestBase类,它允许你模拟InputStream。但正如我上面提到的那样,这只是一个额外的方法调用来获取流。