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

4

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

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);
    }
}

我最初测试的想法是传入一个包含测试数据的文件路径作为url,但我不能这样做,因为我要将其转换为HttpWebRequest,而它会因为文件路径而创建一个FileWebRequest并抛出错误。

有什么好的方法可以解决这个问题吗?我正在使用Visual Studio Test Tools进行测试。

3个回答

8
您有一个问题。正如您所看到的,您的代码执行了两个操作:获取请求和创建对象。
如果您想进行单元测试,我建议将功能拆分(这是一个好习惯)。
一般来说,如果您的函数名很长,使用“and”这个词或描述多个事情,则应该对其进行重构。我们希望得到小方法和小责任,这样我们可以更轻松地替换、扩展或处理它们。类似于...
public WebRequest GetRequest(string url);
public object DeSerializeJSON(WebRequest request, Type type);

可能有效。

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


你为何仍在使用'object'作为GetRequest的返回类型以及DeSerializeJSON的参数?使用"WebRequest"类型是否更好? - Mark Hildreth
谢谢您的建议。我本来就倾向于这样做,但是这个函数看起来已经很简单了。现在我明白为什么这是必要的了。 - dontangg

3

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


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接