2012-01-13 4 views
1

Я пытаюсь запустить небольшой сервер 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 

ответ

0

Если вы проверяете что-то, то почему бы не использовать Rack :: Test, который делает именно это?

+0

Я не использовал его в основном потому, что я не знал об этом ... :-) Также было бы лучше, если бы в тестах http-клиента не было внешних зависимостей. Тем не менее, я посмотрю на это ... Из того, что я видел, он полностью удаляет сервер WEBrick и просто возвращает подготовленный ответ, который я сделал ... Что очень интересно ... Спасибо за ответ , – ldnunes

+0

Да, он издевается над всеми вашими запросами. Извините за ответ, тогда предполагается, что все знают, что Rack :: Test, кто использует Rack или Rails :) – three