2012-07-16 39 views
3

我正在尝试编写集成测试以证明如果尝试连接到服务器的速度太慢,TCP客户端将正确超时。我有一个打开Socket并监听传入连接FakeServer类:伪造与TcpClient和套接字的缓慢连接

public sealed class FakeServer : IDisposable 
{ 
    ... 

    public TimeSpan ConnectDelay 
    { 
     get; set; 
    } 

    public void Start() 
    { 
     this.CreateSocket(); 
     this.socket.Listen(int.MaxValue); 

     this.socket.BeginAccept(this.OnSocketAccepted, null); 
    } 

    private void CreateSocket() 
    { 
     var ip = new IPAddress(new byte[] { 0, 0, 0, 0 }); 
     var endPoint = new IPEndPoint(ip, Port); 
     this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     this.socket.Bind(endPoint); 
    } 

    private void OnSocketAccepted(IAsyncResult asyncResult) 
    { 
     Thread.Sleep(this.connectDelay); 
     this.clientSocket = this.socket.EndAccept(asyncResult); 
    } 
} 

通知我试图通过拖延来Thread.Sleep()呼叫连接的成功。不幸的是,这并不工作:

[Fact] 
public void tcp_client_test() 
{ 
    this.fakeServer.ConnectDelay = TimeSpan.FromSeconds(20); 
    var tcpClient = new TcpClient(); 
    tcpClient.Connect("localhost", FakeServer.Port); 
} 

在上面的测试中,调用tcpClient.Connect()立即成功,服务器端的前OnSocketAccepted方法甚至称。我浏览了一下API,看不到任何明显的方式让我注入一些服务器端逻辑,这些逻辑必须在客户端连接建立之前完成。

有没有什么办法让我伪造一个使用TcpClientSocket的缓慢服务器/连接?

+2

+1的实际测试坏/慢速连接不像无知的世界其他地方:) – leppie 2012-07-16 09:21:44

+1

你可以使用像NetLimiter工具来节流的连接。不幸的是不自由。 – leppie 2012-07-16 09:22:53

+0

有关SO/SE网络的相关问题涉及此主题。许多是特定于浏览器或特定的操作系统(OS X至少有2个),但[这一个](http://stackoverflow.com/questions/1094760/network-tools-that-simulate-slow-network-连接),[这一个](http://stackoverflow.com/questions/11488888/simulate-slow-internet-connection-on-a-real-device)和[this one](http://superuser.com/questions/297103/how-to-simulate-slow-internet-connection)应该有可能使用的解决方案。 – 2012-07-16 09:37:59

回答