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应该是不变的。
答案 0 :(得分:2)
实现此目标的最佳方法是不直接使用HttpRequest.InputStream
。
如果您要创建一个获取输入流的服务,您可以让它在生产中返回HttpRequest.InputStream
,并为单元测试返回自定义流。
答案 1 :(得分:2)
从外部测试:在本地某处托管脚本,并使用您希望它使用的任何身体调用它。它不是一个单元测试,但是如果你需要一个直接覆盖HttpRequest.InputStream读取的单元测试,可以考虑拆分连接部分和流读取;然后,您可以将流阅读器提供给您喜欢的任何流。
答案 2 :(得分:1)
InputStream是标准的Stream,因此如果您希望单元测试解析器解析内容,您只需要传递一个备用Stream。它不一定来自HttpRequest,因为那不是你正在测试的。您正在测试解析是否有效。
如果你必须将它与HttpRequest结合,那么看一下HttpRequestBase类,它允许你模拟InputStream。但正如我上面提到的那样,这只是一个额外的方法调用来获取流。