2014-03-05 52 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