2017-04-11 75 views
0

我正在写一个Downloader(与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连接?什么应该是测试这种异常的有意义的方法?

+0

看看这个[post](http://stackoverflow.com/questions/11025097/untitesting-moq-method-calling-webrequest)。我认为它解释了你想要达到的目标。 – Hintham

+0

一个问题;你为什么抓住并立即重新抛出这些例外?您的代码编写方式,此处引发的任何异常都将显示给调用者。所以我不确定是否需要对此进行单元测试 - 如果webRequest.GetResponse中出现WebException异常将会出错的情况,可以认为它是公理性的;因为那不是你控制的代码,你不需要测试它。 –

+0

您正在使用什么版本的Visual Studio? – zaitsman

回答

0

您没有理由测试连接失败抛出WebException。这不是你的代码正在做投掷。

OTOH,您可能想要在某些时候测试您的代码在抛出时正确处理WebException 。要做到这一点,你将不得不包装或模拟基础的Web请求。

+0

这种方法不是必需的,你可以使用Fakes或TypeMock。 – zaitsman

+0

包含在我写的内容中 - 即“模拟”。 – Charlie

0

单元测试理想情况下不应该依赖网络连接等外部依赖关系。正如上面评论(链接)中提到的那样,你想要模拟这种行为。否则,使用真正的连接将无法测试故障情况,即以自动方式建立良好的连接和无连接。

单元测试应该遵循FIRST acronym

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

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

这种方法的好处是您的单元测试套件可以快速运行(自动化),涵盖许多场景并给予您非常快速的反馈。尽管集成测试可以不经常运行(如果需要),并且您不必太担心它们需要多长时间,因为您在此处所做的所有工作都证明了端到端的连接性。