识别实体模式以抽象网络层以允许可测试性

本文关键字:可测试性 网络层 抽象 实体 模式 识别 | 更新日期: 2023-09-27 17:59:54

我在这里读到了关于等论点的各种问题

如何对TCP服务器进行单元测试?这值得吗?

以及其他更具体的问题,如

有人成功地嘲笑过.NET中的Socket类吗?

犀牛嘲讽:如何建立一个假的插座?

但我还是想把问题发出来。

我需要设计一个抽象网络层。将消费者代码与特定实现解耦应该是抽象的,最后但并非最不重要的是,它可以用fake完全测试。

我最终发现,我不需要模拟Socket类,而是定义更高级别的抽象并模拟它

interface INetworkLayer {
  void OnConnect(Stream netwokStream);
  void OnException(Exception e); // doubts on this  
}

有没有人做过类似的事情,可以提供观察、评论或解释如何看待正确的方向?

识别实体模式以抽象网络层以允许可测试性

我相信您所要求的不是"提高可测试性",而是简单地"测试"通过网络发送的代码。

根据我的经验,只有两件有趣的事情可以测试通过网络发送的东西:

  1. 我的应用程序发送的信息正确吗
  2. 我可以通过网络发送此消息吗

例如,假设您的应用程序可以向另一个服务器发送一些(应用级别)消息。你可以定义这样一个接口:


    public interface MessagePort {
        void Send(Message message, ServerName to);
    }

其中Message是您希望应用程序发送的消息,ServerName是一个类,表示命名消息目标的应用级方法。为了简单起见,ServerName可以是一个简单的字符串,可以通过配置、DNS或其他方式映射到服务器的地址。你选择。

您可以实现MockMessagePort,将消息存储在一个简单的列表中,以测试您的应用程序是否确实发送了正确的消息。(问题1.)

之后,您可以使用环回在网络上实现消息的实际发送。你可能想读一下鲍勃叔叔的"工匠"文章中的一个例子。

http://www.objectmentor.com/resources/publishedArticles.html,主题"工匠"。TCP服务器的测试驱动实现是本系列的一部分,但您应该从头开始阅读。

一个更有趣的抽象是消息收件人的"通道"。


    public interface MessageChannel {
        void Send(Message message);
    }

实施方知道收件人的情况。当然,在这种情况下,还有另一个对象提供通道,来自收件人"ServerName"。

若你们真的想有一个抽象的网络设施模型,好吧,这里是你们可以做的:

  1. 尝试查找两个不同的网络库
  2. 使用每个库编写两次相同的应用程序
  3. 考虑应用程序。应用程序代码应相同,网络部分应不同。它们将被一个接口分隔开。这就是你要找的界面

但老实说,我不相信这会给你的申请带来多大好处。