Я пытаюсь запустить небольшой сервер WEBrick, чтобы издеваться над реальным API, чтобы протестировать клиент-клиент Ruby, который я разрабатываю. Я использую модифицированное решение, основанное на комментариях блога this.Синхронизировать потоки с запуском сервера WEBrick
Он работает нормально, но проблема в том, что каждый раз, когда сервер запускается, родительский поток должен ждать произвольное количество времени для загрузки сервера. И после добавления нескольких тестов он становится очень медленным.
Так что мой вопрос: Есть ли способ синхронизировать родительский поток, чтобы продолжить сразу после того, как поток сервера завершил работу с WEBRick?
Я попытался взглянуть на ссылку WEBrick, найти в Интернете и даже посмотреть в коде WEBrick, но я не получил ничего, что мог бы использовать без какой-либо действительно неприятной патчей обезьян.
Я открыт для других подходов к проблеме, но я хотел бы оставить ее как можно более беззаботной для драгоценных камней и библиотек. Кроме того, решения должны работать в Ruby 1.9.2, on 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
Я не использовал его в основном потому, что я не знал об этом ... :-) Также было бы лучше, если бы в тестах http-клиента не было внешних зависимостей. Тем не менее, я посмотрю на это ... Из того, что я видел, он полностью удаляет сервер WEBrick и просто возвращает подготовленный ответ, который я сделал ... Что очень интересно ... Спасибо за ответ , – ldnunes
Да, он издевается над всеми вашими запросами. Извините за ответ, тогда предполагается, что все знают, что Rack :: Test, кто использует Rack или Rails :) – three