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

时间:2012-01-13 13:44:51

标签: ruby multithreading mocking webrick

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

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

所以我的问题是:有没有办法在服务器线程完成启动WEBRick后立即同步父线程?

我尝试查看WEBrick引用,在网上搜索,甚至看了一下WEBrick代码,但是如果没有一些非常讨厌的猴子修补,我什么都没用。

我对问题的其他方法持开放态度,但我希望尽可能保持对gem和库的依赖。此外,解决方案必须 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

1 个答案:

答案 0 :(得分:0)

如果您正在测试机架,为什么不使用Rack :: Test这样做呢?