Ruby 将线程同步到WEBrick服务器启动

Ruby 将线程同步到WEBrick服务器启动,ruby,multithreading,mocking,webrick,Ruby,Multithreading,Mocking,Webrick,我正在尝试启动一个小型WEBrick服务器来模拟一个真实的API,以测试我正在开发的Ruby http客户机。我正在使用一个基于博客评论的改进解决方案 它可以正常工作,但问题是每次服务器启动时,父线程都必须等待任意时间才能加载服务器。在添加了几个测试之后,它变得非常慢 因此,我的问题是:是否有一种方法可以在服务器线程完成启动WEBRick后立即同步父线程以继续? 我试着查看WEBrick参考资料,搜索网页,甚至查看了WEBrick代码,但是如果没有一些非常讨厌的猴子补丁,我就没有什么用处了 我对

我正在尝试启动一个小型WEBrick服务器来模拟一个真实的API,以测试我正在开发的Ruby http客户机。我正在使用一个基于博客评论的改进解决方案

它可以正常工作,但问题是每次服务器启动时,父线程都必须等待任意时间才能加载服务器。在添加了几个测试之后,它变得非常慢

因此,我的问题是:是否有一种方法可以在服务器线程完成启动WEBRick后立即同步父线程以继续?

我试着查看WEBrick参考资料,搜索网页,甚至查看了WEBrick代码,但是如果没有一些非常讨厌的猴子补丁,我就没有什么用处了

我对解决这个问题的其他方法持开放态度,但我希望它尽可能不依赖于gems和库。此外,解决方案必须在Linux上运行于Ruby 1.9.2

提前感谢您的回答

require "rack"
class ApiMockServer
  def initialize(port = 4000, pause = 1)
    @block = nil
    @parent_thread = Thread.current
    @thread = Thread.new do
      Rack::Handler::WEBrick.run(self, :Port => port, :Host => "127.0.0.1")
    end

    sleep pause # give the server time to fire up… YUK!
  end

  def stop
    Thread.kill(@thread)
  end

  def attach(&block)
    @block = block
  end

  def detach()
    @block = nil
  end

  def call(env)
    begin
      unless @block
        raise "Specify a handler for the request using attach(block). The " +
          "block should return a valid rack response and can test expectations"
      end
      @block.call(env)
    rescue Exception => e
      @parent_thread.raise e
      [ 500, { 'Content-Type' => 'text/plain', 'Content-Length' => '13' }, [ 'Bad test code' ]]
    end
  end
end

如果您正在对某些东西进行机架测试,为什么不使用Rack::Test,它就可以做到这一点?

我没有使用它,主要是因为我不知道它…:-)此外,如果http客户机测试没有任何外部依赖项,则会更好。不过,我还是会看一看。。。据我所见,它完全删除了WEBrick服务器,只返回我准备好的响应。。。这很有趣。。。谢谢你的回答。是的,它嘲弄了你所有的要求。很抱歉这样回答,假设每个人都知道Rack::Test谁在使用Rack或Rails:)