.net - 如何对网络连接进行单元测试?

标签 .net unit-testing mocking moles pex-and-moles

我想对下面的代码进行单元测试。我一直在使用 MSTest 并尝试学习 Microsoft MolesRhinoMocks .但我不能让他们两个都帮我。我知道我可以大幅更改代码以使用使其更具可测试性的接口(interface),但这需要我编写封装 TcpClient、NetworkStream、StreamWriter 和 StreamReader 的接口(interface)和实现。

我已经为此编写了集成测试,我想精通痣的人可以很容易地为此进行单元测试,而无需更改代码。

using (TcpClient tcpClient = new TcpClient(hostName, port))
using (NetworkStream stream = tcpClient.GetStream())
using (StreamWriter writer = new StreamWriter(stream))
using (StreamReader reader = new StreamReader(stream))
{
    writer.AutoFlush = true;
    writer.Write(message);
    return reader.ReadLine();
}

最佳答案

把事情简单化。

抽象掉网络层。我通常使用类似于 INetworkChannel 的接口(interface)。看起来像这样:

public interface INetworkChannel : IDisposable
{
    void Connect(IPEndPoint remoteEndPoint);
    void Send(byte[] buffer, int offset, int count);

    public event EventHandler Disconnected;
    public event EventHandler<ReceivedEventArgs> Received;
}

它使测试一切变得容易,您可以创建 SecureNetworkChannel使用 SslStream 的类或 FastNetworkChannel它使用新的 Async 方法。

使用什么流或是否使用 TcpClient 等详细信息或 Socket与应用程序的其余部分无关。

编辑

测试 INetworkingChannel实现也很容易,因为您现在有了一个职责非常明确的类。我确实创建了与我的实现的连接来测试它们。让 TcpListener监听端口 0让操作系统分配一个空闲端口。

我只是确保它正确处理发送和接收,并在连接关闭/断开时进行适当的清理。

关于.net - 如何对网络连接进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8534000/

相关文章:

java - Mockito 测试框架

c# - 使用 Rhino.Mocks stub 属性 setter 以在调用时执行操作?

.net - XML 省略号/其他语法 - 它叫什么?

java - 如何部分模拟 java.lang.String 的 'equalsIgnoreCase' 方法

java - Mockito 测试 - 上下文对象为 null 异常

java - Java 8 中的覆盖率报告

javascript - 使用 angular/karma/jasmine 模拟异步服务功能

.net - 实现领域驱动设计的功能方式

c# - 如何避免使用枚举?

c# - RedirectToAction 和 RedirectToRoute