【发布时间】:2018-04-27 18:55:46
【问题描述】:
public void HandleRequest(WebhookModel model)
{
var strRequest = "cmd=_notify-validate&" + ipnContext.RequestBody;
var webRequest = FormRequest(strRequest);
var requestStream = _webRequestWrapper.GetRequestStream();
var responseStream = _webRequestWrapper.GetResponse().GetResponseStream();
using (StreamReader reader = new StreamReader(responseStream))
{
model.Verification = reader.ReadToEnd();
}
}
private WebRequest FormRequest(string strRequest)
{
var webRequest = WebRequest.Create("some url is over here");
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.ContentLength = strRequest.Length;
return webRequest;
}
_webrequestWrapper 只是 WebRequest 类的包装。
所以,我的问题是如何模拟 _webRequestWrapper.GetResponse().GetResponseStream() ?问题是模拟GetResponse() 没有问题,因为我们为它创建了WebRequest 的包装器,但问题在于GetReponseStream,因为它返回一个Stream 对象,我如何测试HandleRequest() 方法?
我真的没有任何想法。请帮我。
谢谢
【问题讨论】:
-
你想测试什么?看起来您正在阅读响应流,这不值得测试 IMO。如果您有更多已排除的逻辑,请将其分解为单独的方法并为其编写测试。
-
我只想测试 HandleRequest() 但我不确定它是否值得测试。你能解释一下为什么不需要测试吗?
-
我同意你不应该费心测试响应流读取;它是您的应用程序的外部依赖项。如果您确实需要对其进行测试,那么使用 shim 可能是最好的方法。 See this.
-
你的代码唯一要做的就是
model.Verification = reader.ReadToEnd();,所以你要测试你是否可以在一个对象上设置一个属性。我很确定这在大多数情况下都会起作用。您在WebRequest及其朋友遇到的任何问题都应该使用try/catch块来处理。 -
完全同意你的看法。感谢您的帮助。您能否添加作为答案,以便我可以投票给您
标签: c# .net unit-testing design-patterns