gpt4 book ai didi

Ruby EventMachine 测试

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:15 25 4
gpt4 key购买 nike

我的第一个问题是关于 Ruby 的。我正在尝试测试 Reactor 循环内的 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

所以,我尝试了不同的方法,但一无所获。

基本问题是——我能否使用 RSpec 测试我的代码,使用 should_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.should_receive(:receive_data)

对此:

EchoServer.any_instance.should_receive(:receive_data)

因为 EM 期望一个类来启动服务器,所以上面的 any_instance 技巧将期望该类的任何实例接收该方法。

EMSpecHelper 示例(虽然是官方/标准的)非常复杂,我宁愿坚持使用第一个 rspec 并使用 any_instance,只是为了简单起见。

关于Ruby EventMachine 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16672763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com