【问题标题】:Writing unit test for methods which have network connection dependencies为具有网络连接依赖性的方法编写单元测试
【发布时间】:2017-04-11 18:17:56
【问题描述】:

我正在编写一个下载器(为了玩 TDD 的乐趣),因为我有一个方法,它的职责是连接到文件。

class FileConnectorHttp : IFileConnector
{
public void ConnectToFile()
{
  //creating a concrete web request here.
  HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(UriForTheFileToConnect);

  //sending HEAD request.
  webRequest.Method = "HEAD";

  //other logic for connection will go here.
  try
  {
    HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse;

  }
  catch (ProtocolViolationException e)
  {
    throw;
  }
  catch (InvalidOperationException e)
  {

    throw;
  }

}
}

我写了一个测试,测试连接超时的场景。

[Test]
public void ConnectToSourceFile_ValidUri_Connection_TimeOut_Throws_WebException()
{
  Uri uriForTheFileToDownload = new Uri("https://suppose/this/is/valid/url.txt");

  FileConnectorHttp fileConnectorOverHttp = new FileConnectorHttp(uriForTheFileToDownload);

  Assert.Throws(Is.TypeOf<WebException>(),

    () => fileConnectorOverHttp.ConnectToFile());

}

所以要获得这个异常,我应该关闭我的 Wifi 连接吗?测试这种异常的有意义的方法应该是什么?

【问题讨论】:

  • 看看这个post。我认为它解释了您想要实现的目标。
  • 一个问题;你为什么要捕获并立即重新抛出这些异常?按照您的代码编写方式,此处引发的任何异常都会显示给调用者。所以我不确定是否需要对此进行单元测试——你可以认为如果webRequest.GetResponse 出现问题,将抛出 WebException 是不言而喻的;因为那不是你控制的代码,所以你不需要测试它。
  • 您使用的是什么版本的 Visual Studio?

标签: c# unit-testing tdd nunit


【解决方案1】:

您没有理由测试连接失败会引发 WebException。不是你的代码在抛出。

OTOH,您可能希望在某个时间点测试您的代码是否正确处理了 WebException当它被抛出时。为此,您必须封装或模拟底层网络请求。

【讨论】:

  • 这种方式不是必须的,可以使用Fakes或者TypeMock。
  • 包含在我写的内容中 - 即“模拟”。
【解决方案2】:

理想情况下,单元测试不应依赖于网络连接等外部依赖项。正如上面的评论(链接)中提到的,你想模拟这种行为。否则,使用真实连接将无法测试失败案例,即自动连接良好且无连接。

单元测试应遵循FIRST acronym

  • 快速
  • 独立
  • 可重复
  • 自我验证
  • 及时

如果您需要一个测试来实际使用物理连接,那么您可以编写一个集成或系统测试 - 也许使用 BDD。

这种方法的好处是您的单元测试套件可以快速运行(自动化),涵盖许多场景并为您提供非常快速的反馈。而集成测试可以不那么频繁地运行(如果需要),您不必太担心它们需要多长时间,因为您在这里所做的只是证明端到端连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多