当前位置:  开发笔记 > 编程语言 > 正文

TDD和Mocking TcpClient

如何解决《TDD和MockingTcpClient》经验,为你挑选了2个好方法。

人们如何处理模拟TcpClient(或TcpClient之类的东西)?

我有一个接收TcpClient的服务.我应该把它包装成更可模仿的东西吗?我该怎么做呢?



1> Doron Yaacob..:

当来到非测试友好的模拟类(即密封/未实现任何接口/方法不是虚拟的)时,您可能希望使用适配器设计模式.

在此模式中,您将添加一个实现接口的包装类.然后,您应该模拟接口,并确保所有代码都使用该接口而不是不友好的具体类.它看起来像这样:

public interface ITcpClient
{
   Stream GetStream(); 
   // Anything you need here       
}
public class TcpClientAdapter: ITcpClient
{
   private TcpClient wrappedClient;
   public TcpClientAdapter(TcpClient client)
   {
    wrappedClient = client;
   }

   public Stream GetStream()
   {
     return wrappedClient.GetStream();
   }
}



2> casademora..:

我认为@Hitchhiker走在正确的轨道上,但我也想考虑将这样的事情进一步抽象出来.

我不会直接嘲笑TcpClient,因为即使你已经编写了测试,这仍然会使你与底层实现过于紧密.也就是说,您的实现特别依赖于TcpClient方法.就个人而言,我会尝试这样的事情:

   [Test]
    public void TestInput(){

       NetworkInputSource mockInput = mocks.CreateMock();
       Consumer c = new Consumer(mockInput);

       c.ReadAll();
    //   c.Read();
    //   c.ReadLine();

    }

    public class TcpClientAdapter : NetworkInputSource
    {
       private TcpClient _client;
       public string ReadAll()
       { 
           return new StreamReader(_tcpClient.GetStream()).ReadToEnd();
       }

       public string Read() { ... }
       public string ReadLine() { ... }
    }

    public interface NetworkInputSource
    {
       public string ReadAll(); 
       public string Read();
       public string ReadLine();
    }

此实现将完全将您与Tcp相关的详细信息(如果这是设计目标)分离,您甚至可以从硬编码值集或测试输入文件中输入测试输入.如果你正在考虑长期测试你的代码,那就非常有用了.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有