2013-05-21 6 views
7

रूबी से संबंधित मेरा पहला प्रश्न। मैं रिएक्टर लूप के अंदर EventMachine इंटरैक्शन का परीक्षण करने की कोशिश कर रहा हूं - मुझे लगता है कि इसे "कार्यात्मक" परीक्षण के रूप में वर्गीकृत किया जा सकता है।रूबी इवेंटमैचिन परीक्षण

कहें कि मेरे पास दो वर्ग हैं - एक सर्वर और ग्राहक। और मैं दोनों पक्षों का परीक्षण करना चाहता हूं - मुझे उनकी बातचीत के बारे में सुनिश्चित होना चाहिए।

सर्वर:

require 'singleton' 

class EchoServer < EM::Connection 
    include EM::Protocols::LineProtocol 

    def post_init 
    puts "-- someone connected to the echo server!" 
    end 

    def receive_data data 
    send_data ">>>you sent: #{data}" 
    close_connection if data =~ /quit/i 
    end 

    def unbind 
    puts "-- someone disconnected from the echo server!" 
    end 
end 

ग्राहक:

class EchoClient < EM::Connection 
    include EM::Protocols::LineProtocol 

    def post_init 
    send_data "Hello" 
    end 

    def receive_data(data) 
    @message = data 
    p data 
    end 

    def unbind 
    puts "-- someone disconnected from the echo server!" 
    end 
end 

तो, मैं अलग दृष्टिकोण की कोशिश की और कुछ भी नहीं के साथ आया है।

मौलिक सवाल यह है कि - क्या मैं किसी भी तरह से res_recive का उपयोग करके आरएसपीईसी के साथ अपने कोड का परीक्षण कर सकता हूं?

EventMachine पैरामीटर एक वर्ग या मॉड्यूल होना चाहिए, इसलिए मैं अंदर तत्काल/मॉक कोड नहीं भेज सकता। सही?

ऐसा कुछ?

describe 'simple rspec test' do 
    it 'should pass the test' do 
    EventMachine.run { 
     EventMachine::start_server "127.0.0.1", 8081, EchoServer 
     puts 'running echo server on 8081' 

     EchoServer.should_receive(:receive_data) 

     EventMachine.connect '127.0.0.1', 8081, EchoClient 

     EventMachine.add_timer 1 do 
     puts 'Second passed. Stop loop.' 
     EventMachine.stop_event_loop 
     end 
    } 
    end 
end 

और यदि नहीं, तो आप इसे EM :: SpecHelper के साथ कैसे करेंगे? मेरे पास यह कोड इसका उपयोग कर रहा है, और यह पता नहीं लगा सकता कि मैं क्या गलत कर रहा हूं।

describe 'when server is run and client sends data' do 
    include EM::SpecHelper 

    default_timeout 2 

    def start_server 
    EM.start_server('0.0.0.0', 12345) { |ws| 
     yield ws if block_given? 
    } 
    end 

    def start_client 
    client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient) 
    yield client if block_given? 
    return client 
    end 

    describe "examples from the spec" do 
    it "should accept a single-frame text message" do 
     em { 
     start_server 

     start_client { |client| 
      client.onopen { 
      client.send_data("\x04\x05Hello") 
      } 
     } 
     } 
    end 
    end 
end 

इन परीक्षणों की बहुत सारी विविधताओं का प्रयास किया और मैं इसे समझ नहीं पाया। मुझे यकीन है कि मुझे यहां कुछ याद आ रहा है ...

आपकी मदद के लिए धन्यवाद।

EchoServer.any_instance.should_receive(:receive_data) 

के बाद से ईएम एक सर्वर शुरू करने के लिए एक वर्ग की उम्मीद कर रहा है, ऊपर any_instance चाल करेंगे:

EchoServer.should_receive(:receive_data) 
इस के लिए

:

उत्तर

4

सरल समाधान है कि मैं के बारे में सोच सकते हैं कि यह बदलने के लिए है उस विधि को प्राप्त करने के लिए उस वर्ग के किसी भी उदाहरण की अपेक्षा करें।

ईएमएसपीसी हेल्पर उदाहरण (आधिकारिक/मानक होने के दौरान) काफी गड़बड़ है, मैं पहले आरएसपीईसी के साथ चिपकना चाहता हूं और सादगी के लिए केवल any_instance का उपयोग करना चाहता हूं।

+1

यह काम करता है। ध्यान में रखना एक बात यह है कि चाहिए_क्रैकिव विधि को रोकता है, इसलिए यह कार्य करता है जैसे विधि में कुछ भी नहीं है। धन्यवाद। – pfh

+0

http://axonflux.com/rspecs-shouldreceive-doesnt-ac – pfh

+1

हां, आरएसपीईसी भी [मूल विधि को फिर से कॉल करने का समर्थन करता है] (https://www.relishapp.com/rspec/rspec-mocks/v/2- 12/दस्तावेज़/संदेश-अपेक्षाएं/कॉलिंग-द-मूल-विधि) v2.12 के बाद से। – Subhas

संबंधित मुद्दे