gpt4 book ai didi

c# - 确定一个实体模式来抽象网络层以实现可测试性

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:30 24 4
gpt4 key购买 nike

我在这里读过关于这个论点的各种问题,比如

How do you unit-test a TCP Server? Is it even worth it?

和其他更具体的问题

Has anyone successfully mocked the Socket class in .NET?

rhino mocks: how to build a fake socket?

但无论如何我还是想发布问题。

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

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

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

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

最佳答案

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

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

  1. 我的应用程序是否发送了正确的消息?
  2. 我可以通过网络发送这条消息吗?

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



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

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

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

之后,您可以通过使用环回实现消息在网络上的实际发送。您可能想阅读 Uncle Bob 的“工匠”文章以获取这方面的示例。

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

一个更有趣的抽象是消息收件人的“ channel ”。



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

实现知道收件人的地方。当然,在这种情况下,还有另一个对象提供 channel ,来自收件人“ServerName”。

如果你真的想要一个网络设施的抽象模型,好吧,你可以这样做:

  1. 尝试找到两个不同的网络库。
  2. 使用每个库编写同一个应用程序两次。
  3. 考虑应用。应用代码应该相同,网络部分应该不同。它们将被一个接口(interface)分隔开。这就是您正在寻找的界面。

但老实说,我不认为它会给您的申请带来多大帮助。

关于c# - 确定一个实体模式来抽象网络层以实现可测试性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com