【发布时间】:2015-08-01 04:29:24
【问题描述】:
我正在使用EventMachine 编写一个通过套接字进行通信的无头Ruby 应用程序。我想为这个应用程序编写一些单元测试。这意味着我的 Ruby 测试脚本需要在后台启动该应用程序,与它执行套接字通信,然后关闭该进程。
此代码失败。套接字连接被拒绝。
require 'socket'
PORT = 7331
CMD = File.expand_path("../../bin/rb3jay",__FILE__)
@thread = Thread.new{ `#{CMD} -D --port #{PORT}` }
@socket = TCPSocket.open('localhost', PORT)
#=> Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 7331
如果我在尝试套接字连接之前注入 2 秒延迟,它会按预期工作:
@thread = Thread.new{ `#{CMD} -D --port #{PORT}` }
sleep 2
@socket = TCPSocket.open('localhost', PORT)
这似乎是一个严重的黑客行为。也许 2 秒对我的机器来说足够长,但在其他地方太短了。
我应该如何在后台正确启动我的 EventMachine 应用程序,并在它准备好后立即创建到它的套接字连接?
【问题讨论】:
-
我曾考虑在我的单元测试文件中使用 EventMachine 作为客户端,而不是标准的 Ruby
socket库,但我无法弄清楚如何以某种方式将其事件循环与MiniTest::Unit一起使用这允许我在每次测试之前重新建立服务器和连接。
标签: ruby macos sockets eventmachine