रूबी से संबंधित मेरा पहला प्रश्न। मैं रिएक्टर लूप के अंदर 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)
इस के लिए
:
यह काम करता है। ध्यान में रखना एक बात यह है कि चाहिए_क्रैकिव विधि को रोकता है, इसलिए यह कार्य करता है जैसे विधि में कुछ भी नहीं है। धन्यवाद। – pfh
http://axonflux.com/rspecs-shouldreceive-doesnt-ac – pfh
हां, आरएसपीईसी भी [मूल विधि को फिर से कॉल करने का समर्थन करता है] (https://www.relishapp.com/rspec/rspec-mocks/v/2- 12/दस्तावेज़/संदेश-अपेक्षाएं/कॉलिंग-द-मूल-विधि) v2.12 के बाद से। – Subhas