Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何对网络连接进行单元测试?_.net_Unit Testing_Mocking_Moles_Pex And Moles - Fatal编程技术网

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

.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

我想对下面的代码进行单元测试。我一直在与MSTest合作,我试图学习和学习。但我不能让他们两个都帮我。我知道我可以彻底更改代码,以使用使其更易于测试的接口,但这需要我编写封装TcpClient、NetworkStream、StreamWriter和StreamReader的接口和实现的代码

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

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
方法。对,非常好的简化!