Я пытаюсь запустить небольшой WEBrick-сервер, чтобы смоделировать настоящий API, для тестирования клиента Ruby http, который я разрабатываю.Я использую модифицированное решение, основанное на этом комментариях к блогу.
Это работает нормально, но проблема в том, что при каждом запуске сервера родительский поток должен ждать произвольныйколичество времени для загрузки сервера.И после добавления нескольких тестов это становится очень медленным.
Так что мой вопрос: есть ли способ синхронизировать родительский поток для продолжения сразу после того, как поток сервера завершил запуск WEBRick?
Я пытался просмотреть ссылку на WEBrick, искал в Интернете и даже заглянул в код WEBrick, но у меня не было ничего, что я мог бы использовать без каких-либо действительно неприятных исправлений обезьяны.другие подходы к проблеме, но я хотел бы сохранить ее как можно более независимой от гемов и библиотек.Кроме того, решения должны работать в Ruby 1.9.2 , в Linux .
Заранее спасибо за ответы!
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