我正在实现一个API,它处理应用程序和互联网之间的不同通信(WebSocket
,Socket.IO
,WebClient
http请求..)TDD方式。到目前为止,我能够为所有方法编写单元测试,因为我可以封装所有调用以模拟它们。例如,当一个方法通过System.Net.Webclient
使用http请求时,我可以通过模拟HttpWebResponse
来完全控制。
现在,对于下一个请求,我必须使用第三方库,最后只发送http请求。问题是我不知道如何模拟,因为所有类都是具体的(最密封的)类。为简化起见,这是一个简短的例子。
这是我想要进行单元测试的方法。它发出请求并根据请求返回的响应调用回调:
public void MyMethodIwantToUnitTest(string data, Action<SomeData> callback)
第三方lib非常简单,您使用回调构建请求并将其发送出去:
HTTPRequest request = new HTTPRequest(new Uri("https://google.com"), onRequestFinished);
request.Send();
void OnRequestFinished(HTTPRequest request, HTTPResponse response)
{
// here would be basically the logic I want to test
}
我需要的是以某种方式在我的统一测试中调用onRequestFinished
,使用模拟HTTPResponse
(HttpResponse
只是一个具体的类)。
我不知道这是否可能。
答案 0 :(得分:0)
这是我的看法。 客户端代码使用IResource.Fetch(url,callback)
使用模拟框架创建IResource模拟&amp;无论何时调用,都会使用所需的响应/数据调用回调。将其作为依赖项插入调用代码。
问题中最后一个片段中的代码移动到真正的IResource.Fetch实现中。由于这是在边缘,我通常使用集成测试 - 针对真实网络运行。 如果我有一个类型,其职责是将某些内容序列化到磁盘/数据库,我会通过一个完整周期的集成测试来验证。 假设:
慢。更有信心,也绕过了不稳定的图书馆问题。我用“集成”类别标记它们并在提交之前运行这些测试,而不是在每次编辑之后运行。