.net 如何对网络连接进行单元测试?
我想对下面的代码进行单元测试。我一直在与MSTest合作,我试图学习和学习。但我不能让他们两个都帮我。我知道我可以彻底更改代码,以使用使其更易于测试的接口,但这需要我编写封装TcpClient、NetworkStream、StreamWriter和StreamReader的接口和实现的代码 我已经为此编写了集成测试,我想精通moles的人可以很容易地对此进行单元测试,而无需更改代码.net 如何对网络连接进行单元测试?,.net,unit-testing,mocking,moles,pex-and-moles,.net,Unit Testing,Mocking,Moles,Pex And Moles,我想对下面的代码进行单元测试。我一直在与MSTest合作,我试图学习和学习。但我不能让他们两个都帮我。我知道我可以彻底更改代码,以使用使其更易于测试的接口,但这需要我编写封装TcpClient、NetworkStream、StreamWriter和StreamReader的接口和实现的代码 我已经为此编写了集成测试,我想精通moles的人可以很容易地对此进行单元测试,而无需更改代码 using (TcpClient tcpClient = new TcpClient(hostName, port
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
的接口,它看起来像这样:
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;
}
公共接口INetworkChannel:IDisposable
{
void Connect(IPEndPoint远程端点);
无效发送(字节[]缓冲区、整数偏移量、整数计数);
公共事件事件处理程序断开连接;
收到公共事件事件处理程序;
}
它使测试一切变得简单,您可以创建使用SslStream
的SecureNetworkChannel
类,或使用新的异步方法的FastNetworkChannel
对于应用程序的其余部分来说,诸如使用了什么流或是否使用了TcpClient
或Socket
之类的细节应该无关紧要
编辑
测试INetworkingChannel
实现也很容易,因为您现在得到了一个职责非常明确的类。我确实创建了一个到我的实现的连接来测试它们。让TcpListener
监听端口0
,让操作系统分配一个空闲端口
我只是确保它正确地处理发送和接收,并在连接关闭/断开时进行适当的清理。有些事情不值得尝试“单元测试”。如果你模拟出这个方法使用的片段,你基本上要检查一个属性设置器,一个对
writer
的方法调用和一个对reader
的方法调用。这里的行为不多,测试也不太有趣。现在测试使用这种方法的类会很有趣,所以我会完全让这个类实现一个接口,并测试调用它的组件;如果我要模仿这样的事情,我肯定会想要一个简化的接口来连接大量涉及的类。基本上是一个门面模式(正如您在这里所做的)。我喜欢这个界面的设计,因为它很少有胆量去实现,而且背后几乎没有应用程序自定义逻辑。我唯一担心的是,这是不可能的。“应该是吗?”默林摩根·格雷厄姆:你说得对。套接字应始终被处置,尤其是在服务器中。由于Socket
对象无法重用,因此实际上不需要使用Close
方法。对,非常好的简化!