Как проверить (rspec) HTTP-запрос, который занимает слишком много времени? - PullRequest
5 голосов
/ 25 января 2012

Как проверить поведение, если запрос занимает слишком много времени с rspec?

Я подумываю об использовании потока, чтобы высмеивать это:

describe "Test" do 
  it "should timeout if the request takes too long" do 
    lambda {
      thread1 = Thread.new { #net::http request to google.com }
      thread2 = Thread.new { sleep(xx seconds) }
      thread1.join 
      thread2.join
    }.should raise_error
  end 
end

Я хочу убедиться, что послесначала делается запрос, другой поток «включается», который в этом случае просто бездействует в течение хх секунд.Тогда я должен ожидать, что запрос истечет время ожидания, потому что выполнение

занимает слишком много времени. Я думаю, что есть лучшие способы сделать это.Учитывая тот факт, что URL, который я запрашиваю, не имеет отношения к делу.Я просто хочу проверить, действительно ли истечет время ожидания, если выполнение займет слишком много времени.

Могу ли я использовать stub (), ожидаем () или любые другие функции rspec для имитации этого?

Есть ли способ, которым я могу передать "блок" в метод заглушки

http_request_to_google.stub(:connection).executethisblock(sleep for xx seconds)
.and_throw error ?

любая помощь приветствуется

Ответы [ 3 ]

9 голосов
/ 25 января 2012

Следующий тест не пройден, если запрос не завершится через 20 секунд. Также происходит сбой, если код в лямбде не вызывает Timeout :: Error.

Итак, успешный сценарий - это когда long_running_stuff вызывает исключение менее чем за 20 секунд.

require 'timeout'

describe "Test" do 
  it "should timeout if the request takes too long" do 
    Timeout::timeout(20) do # 20 seconds
      lambda {
         long_running_stuff(:timeout => 10.seconds)
      }.should raise_error(Timeout::Error)
    end
  end 
end
6 голосов
/ 25 января 2012

Если вы просто заботитесь о том, чтобы Net :: HTTP вызывал Timeout :: Error, вы всегда можете просто заставить его вернуть ошибку с ложным выводом, здесь - хорошая компиляция различных вещей, которые вы можете использовать с RSpec.

Это будет зависеть от вашего точного запроса Net :: HTTP, но что-то вроде Net::HTTP.should_receive(:request_get).and_raise(Timeout::Error) будет пропускать любые сетевые вызовы и просто немедленно выдавать ошибку.

3 голосов
/ 24 августа 2017

Я понимаю, что этот вопрос древний, но вот еще одно решение, использующее WebMock gem:

stub_request(:any, 'www.google.com').to_timeout

Еще одно приятное преимущество для обработки запроса с помощью Webmock состоит в том, что это будет работатьдаже если вы поменяете свой HTTP-клиент, который отделит ваши тесты от вашего кода.

...