使用Web请求为函数编写单元测试

时间:2011-05-18 19:35:42

标签: c# .net unit-testing .net-4.0

这是一个我想编写单元测试的函数:

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测试工具进行测试。

3 个答案:

答案 0 :(得分:8)

你这里有问题。如您所见,您的代码执行两项操作。它获取请求然后创建一个对象。

如果你想进行单元测试,我建议拆分功能(不管怎么说都是好事)

(经验法则:如果函数的名称很长,使用'和'字或描述多个东西,那么你应该重构它。我们想要小方法,责任小,所以我们可以替换它们或扩展它们他们或将来更容易与他们做某事)。

像...这样的东西。

public WebRequest GetRequest(string url);
public object DeSerializeJSON(WebRequest request, Type type);

可能有用。

现在,您可以在测试方法中注入模拟请求并相应地测试功能。

答案 1 :(得分:3)

您需要抽象掉WebRequest对象,以便可以用模拟对象替换它。

答案 2 :(得分:3)

我完全赞同麦卡布拉尔和约翰桑德斯。几年前,我写了一个little abstraction over HttpWebRequest等来启用对依赖于这些类的代码进行模拟。