这是一个我想编写单元测试的函数:
public object RequestAndSerializeJSON(string url, Type type) {
var request = (HttpWebRequest)WebRequest.Create(url);
request.Accept = "application/json";
var response = request.GetResponse();
using (var responseStream = response.GetResponseStream())
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(type);
return serializer.ReadObject(responseStream);
}
}
我对测试这个的第一个想法是将路径传递给包含测试数据的文件,但是我不能这样做,因为我将它转换为HttpWebRequest
并且它会抛出文件路径出错,因为它为文件路径创建了FileWebRequest
。
这样做的好方法是什么?我正在使用Visual Studio测试工具进行测试。
答案 0 :(得分:8)
你这里有问题。如您所见,您的代码执行两项操作。它获取请求然后创建一个对象。
如果你想进行单元测试,我建议拆分功能(不管怎么说都是好事)
(经验法则:如果函数的名称很长,使用'和'字或描述多个东西,那么你应该重构它。我们想要小方法,责任小,所以我们可以替换它们或扩展它们他们或将来更容易与他们做某事)。
像...这样的东西。
public WebRequest GetRequest(string url);
public object DeSerializeJSON(WebRequest request, Type type);
可能有用。
现在,您可以在测试方法中注入模拟请求并相应地测试功能。
答案 1 :(得分:3)
您需要抽象掉WebRequest对象,以便可以用模拟对象替换它。
答案 2 :(得分:3)
我完全赞同麦卡布拉尔和约翰桑德斯。几年前,我写了一个little abstraction over HttpWebRequest等来启用对依赖于这些类的代码进行模拟。