Rails 4: как сделать запрос извне приложения Rails во время интеграционного теста? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть приложение, которое требует двусторонней связи с внешним демоном (bitcoind).В bitcoind есть функциональность, которая позволяет вызывать мое приложение всякий раз, когда происходит новый интересующий блок или транзакция ('--walletnotify' и '--blocknotify').Для этого я использую CURL для запроса "http://myapp/walletnotify" и так далее:

walletnotify = /usr/bin/curl --max-time 60 http://myapp/walletnotify/%s

Я пытаюсь создать интеграционные тесты для этого поведения обратного вызова. К сожалению, при выполнении интеграционных тестов яЯ получаю ошибки на стороне демона, так как он не может выполнять запросы к "http://myapp/walletnotify" - очевидно, что сервер Rails не может быть достигнут (или соединение прервано?).Конечно, тесты проваливаются, так как соответствующие действия не вызываются.

Мой вопрос: как правильно протестировать такой сценарий?Есть ли способ разрешить прямые внешние запросы к приложению во время интеграционных тестов?Есть ли способ убедиться, что сервер Rails работает во время интеграционных тестов?Или, может быть, я должен прослушивать такие запросы в интеграционном тесте, а затем передавать их в приложение?

Обновление 2018-06-03: я использую minitest.Тест, который я пытаюсь запустить, находится здесь:

https://github.com/cryptogopher/token_voting/blob/master/test/integration/token_votes_notify_test.rb

После вызова

@rpc.generate(101)

демон bitcoind в режиме regtest должен сгенерировать 101 блок и вызвать 'blocknotify 'обратные вызовы.Проблема в том, что он не может отправить HTTP-запрос приложению во время теста.

1 Ответ

0 голосов
/ 06 июня 2018

Хорошо, я решил эту проблему.

Похоже, что minitest не запускает сервер приложений независимо от того, какой драйвер вы выберете.Тем не менее, вы можете запустить собственный HTTP-сервер для прослушивания уведомлений из внешних источников и пересылать их в тестируемое приложение.

Для этого вам потребуется:

require 'webrick'

Настройка HTTP-сервера (регистрация отключена)чтобы избежать беспорядка):

server = WEBrick::HTTPServer.new(
  Port: 3000,
  Logger: WEBrick::Log.new("/dev/null"),
  AccessLog: []
)

Укажите, как обрабатывать входящие HTTP-запросы.В моем случае будут только запросы GET, но важно перенаправить их с оригинальными заголовками:

server.mount_proc '/' do |req, resp|
  headers = {}
  req.header.each { |k,v| v.each { |a| headers[k] = a } }
  resp = get req.path, {}, headers
end

Запустить HTTP-сервер в отдельном потоке (он блокирует поток, в котором он выполняется):

@t = Thread.new {
  server.start
}
Minitest.after_run do
  @t.kill
  @t.join
end
Timeout.timeout(5) do
  sleep 0.1 until server.status == :Running
end
...