如何使用Moq,Xunit

时间:2016-04-20 12:38:34

标签: c# tdd moq

我正在实现一个API,它处理应用程序和互联网之间的不同通信(WebSocketSocket.IOWebClient 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,使用模拟HTTPResponseHttpResponse只是一个具体的类)。 我不知道这是否可能。

1 个答案:

答案 0 :(得分:0)

这是我的看法。 客户端代码使用IResource.Fetch(url,callback)

使用模拟框架创建IResource模拟&amp;无论何时调用,都会使用所需的响应/数据调用回调。将其作为依赖项插入调用代码。

问题中最后一个片段中的代码移动到真正的IResource.Fetch实现中。由于这是在边缘,我通常使用集成测试 - 针对真实网络运行。  如果我有一个类型,其职责是将某些内容序列化到磁盘/数据库,我会通过一个完整周期的集成测试来验证。 假设:

  1. 这种类型的逻辑不多 - 它是传递给具体的库。
  2. 实施后,此代码不会经常修改
  3. 慢。更有信心,也绕过了不稳定的图书馆问题。我用“集成”类别标记它们并在提交之前运行这些测试,而不是在每次编辑之后运行。