识别实体模式以抽象网络层以允许可测试性
本文关键字:可测试性 网络层 抽象 实体 模式 识别 | 更新日期: 2023-09-27 17:59:54
我在这里读到了关于等论点的各种问题
如何对TCP服务器进行单元测试?这值得吗?
以及其他更具体的问题,如
有人成功地嘲笑过.NET中的Socket类吗?
犀牛嘲讽:如何建立一个假的插座?
但我还是想把问题发出来。
我需要设计一个抽象网络层。将消费者代码与特定实现解耦应该是抽象的,最后但并非最不重要的是,它可以用fake完全测试。
我最终发现,我不需要模拟Socket
类,而是定义更高级别的抽象并模拟它
interface INetworkLayer {
void OnConnect(Stream netwokStream);
void OnException(Exception e); // doubts on this
}
有没有人做过类似的事情,可以提供观察、评论或解释如何看待正确的方向?
我相信您所要求的不是"提高可测试性",而是简单地"测试"通过网络发送的代码。
根据我的经验,只有两件有趣的事情可以测试通过网络发送的东西:
- 我的应用程序发送的信息正确吗
- 我可以通过网络发送此消息吗
例如,假设您的应用程序可以向另一个服务器发送一些(应用级别)消息。你可以定义这样一个接口:
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"。
若你们真的想有一个抽象的网络设施模型,好吧,这里是你们可以做的:
- 尝试查找两个不同的网络库
- 使用每个库编写两次相同的应用程序
- 考虑应用程序。应用程序代码应相同,网络部分应不同。它们将被一个接口分隔开。这就是你要找的界面
但老实说,我不相信这会给你的申请带来多大好处。