2

我在这里阅读了有关论点的各种问题,例如

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

和其他更具体的问题

有没有人成功地模拟过 .NET 中的 Socket 类?

rhino mocks:如何建立一个假套接字?

但我无论如何都觉得要发布这个问题。

我需要设计一个抽象的网络层。将消费者代码从依赖于特定实现中分离出来应该是抽象的,最后但并非最不重要的一点是,可以用假货完全测试。

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

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

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

4

1 回答 1

2

我相信您要问的不是“提高可测试性”,而只是“测试”通过网络发送内容的代码。

根据我的经验,对于通过网络发送的内容,只有两件有趣的事情需要测试:

  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. 考虑应用程序。应用代码应该相同,网络部分应该不同。它们将由一个接口分隔。这是您正在寻找的界面。

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

于 2013-02-16T23:35:29.750 回答