Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为具有网络连接依赖项的方法编写单元测试_C#_Unit Testing_Tdd_Nunit - Fatal编程技术网

C# 为具有网络连接依赖项的方法编写单元测试

C# 为具有网络连接依赖项的方法编写单元测试,c#,unit-testing,tdd,nunit,C#,Unit Testing,Tdd,Nunit,我正在编写一个下载程序(为了与TDD玩得开心),因为我有一个方法,其职责是连接到文件 class FileConnectorHttp : IFileConnector { public void ConnectToFile() { //creating a concrete web request here. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(UriForTheFileToConnect);

我正在编写一个下载程序(为了与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());

}
[测试]
public void ConnectToSourceFile_ValidUri_Connection_TimeOut_Throws_WebException()
{
Uri uriForTheFileToDownload=新Uri(“https://suppose/this/is/valid/url.txt");
FileConnectorHttp fileConnectorOverHttp=新的FileConnectorHttp(uriForTheFileToDownload);
Assert.Throws(Is.TypeOf(),
()=>fileConnectorOverHttp.ConnectToFile());
}

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

没有理由测试连接失败会引发WebException。这不是你的代码在做的投掷


当然,您可能希望在某个时候测试您的代码在抛出WebException时是否正确地处理它。为此,您必须包装或模拟底层web请求。

理想情况下,单元测试不应依赖于网络连接等外部依赖性。正如上面的评论(链接)中提到的,您希望模拟这种行为。否则,使用真正的连接,您将无法自动测试故障情况,即良好连接和无连接

单元测试应遵循

  • 快速
  • 独立的
  • 可重复
  • 自我验证
  • 适时
如果您需要一个测试来实际使用物理连接,那么您可以编写一个集成或系统测试——可能使用BDD


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

请查看此内容。我想这解释了你想要达到的目标;为什么要捕获并立即重新抛出这些异常?按照编写代码的方式,调用方将看到此处引发的任何异常。因此,我不确定是否有必要对这个单元进行测试——如果在<代码> WebRestQuest.GETRebug < /C>中发生了WebExchange异常,您可以认为它是公理的;因为这不是您控制的代码,所以您不需要测试它。您使用的是Visual Studio的哪个版本?这种方法不是必需的,您可以使用Fakes或TypeMock。包括在我编写的内容中,即“mock”。