2014-03-05 53 views
0

我该如何模拟网络连接?嘲笑网络连接

假设我正在编写客户端 - 服务器拓扑;客户端已经就位,但我想测试一下,如果在服务器上接收到一个事件被触发的网络连接,或者响应于正在接收的网络连接而调用功能。

我目前使用EventMachine的,我想弄清楚如何单元测试这些相互作用确保嘲笑的网络连接/邮件将被正确处理不必做集成测试,实际上不必写一个客户端,将相应的消息发送到测试界面。我希望这是有道理的?

基本上,我希望能够对服务器进行测试,以确保它能够正确响应模拟消息,而无需打开真正的互联网连接或仅为测试编写专用客户端 - 我宁愿成为能够说'这是我想要收到的消息,现在假装我从一个真正的客户端收到并处理它'

+0

我必须说我不太了解Ruby,但肯定有一个半可接受的嘲笑框架可以用来解决这个问题吗? –

+0

这不是使用模拟框架的问题,我问如何模拟连接到服务器的连接与交互之间的交互。 :(例如,我想知道如何让'我的课程'意识到它已经获得了连接。EventMachine似乎是通过魔术来实现的 –

+0

一个更好的例子是在C#中(尽管它仍然发生在Ruby中)你有BeginAcceptAsync方法 - 你如何在测试中触发一个事件来说明已经接收到连接(并且因此调用EndAcceptAsync)? –

回答

0

我解决了这个问题,只需在EventMachine中实例化连接类的实例, tehn直接调用该方法 - 不知道为什么我没有想到这一点!

describe 'Network manager' do 
    it 'should call the ChangeStatus handler when it receives the ChangeStatus packet' do 
    # Arrange 
    connection = TcpConnection.new 
    # Set up the packet handler 
    packet_handler = double 'TcpPacketHandler' 
    # Inject dependency 
    connection.packet_handler = packet_handler 
    # Create the message 

    data = [ 15, # message code + payload size 
     0, # message code 
     4, # protocol version 
     12, # size of string 
    ] 

    data.push 'hello, world'.bytes.to_a 
    reader, writer = IO.pipe 
    writer.write data 
    writer.close 


    puts data 

    # Assert 
    expect(packet_handler).to receive(:handle_message).with(data[1], anything()).once 

    message = reader.read 
    # Act 
    connection.receive_data message 
    end 
end