У меня есть относительно простой рабочий, который использует Excon, чтобы получить что-то из Интернета. Я пытаюсь быть хорошим тестировщиком и использую Webmock, чтобы принудительно заглушить интернет-взаимодействия, так что я фактически проверяю, что должен делать код на основе различных заглушенных взаимодействий.
Я заметил, что RSpec не отлавливает сбои, происходящие внутри рабочего процесса. Это может быть мой код, это может быть ошибка, я не уверен.
Вот простой рабочий пример (да, я знаю, что спасательное исключение — это плохо, я исправлю это дальше):
include Sidekiq::Worker
sidekiq_options queue: 'fetch_article_content', retry: true, backtrace: true
def perform(url)
begin
Excon.get(url)
rescue Exception => e
Rails.logger.warn("error: #{e}")
nil
end
end
end
А вот упрощенный тест RSpec:
Sidekiq::Testing.inline!
work = FetchArticleContentWorker.new
work.perform("http://google.com")
При включенном Webmock это приводит к сбою Excon (видно в файле test.log):
error: Real HTTP connections are disabled. Unregistered request: ...
Тем не менее, RSpec считает, что это сработало просто отлично:
.
Finished in 0.44487 seconds (files took 5.35 seconds to load)
1 example, 0 failures
Я не уверен, что я делаю неправильно здесь. Я бы ожидал, что тот факт, что Sidekiq perform
не был доведен до RSpec, как провал, но это не так.
- Я не правильно ловлю эту ошибку?
- Должен ли я проверять что-то в отношении статуса задания вместо того, чтобы ожидать, что RSpec поймает эту ошибку в рабочем?
- Должен ли я делать что-то совершенно другое?
Спасибо!