使用RSpec测试时,如何在Sidekiq worker中正确捕获错误?

我有一个相对简单的工作人员,他使用excon从互联网上抢走一些东西。我正在努力成为一名优秀的测试人员,并使用Webmock强制对Internet交互进行存根,以便实际上我在测试基于各种存根交互的代码应执行的操作。

我注意到RSpec不能捕获在worker内部发生的故障。我不确定这可能是我的代码,也可能是错误。

这是一个简单的工作程序示例(是的,我知道抢救异常是不好的,接下来我会解决这个问题):

  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在工作人员中捕获此错误吗?
  • 我应该完全做其他事情吗?

谢谢!

iCMS 回答:使用RSpec测试时,如何在Sidekiq worker中正确捕获错误?

我认为从rspec的角度来看,没有错误,因为它是在工作线程内部捕获/处理的。如您所料,如果您取消了该救援,那么测试会失败。相反,您可以签入测试以查看perform是否返回非null值以便通过。有帮助吗?

,

为了使RSpec看到异常,代码必须引发一个异常。

您可以重新引发现有异常:

def perform(url)
  begin
    Excon.get(url)
  rescue Exception => e
    Rails.logger.warn("error: #{e}")
    raise e
  end
end

您可以将现有的异常包装在自己的异常中:

class MyFancyException < StandardError; end

def perform(url)
  begin
    Excon.get(url)
  rescue Exception => e
    Rails.logger.warn("error: #{e}")
    raise MyFancyException.new(e)
  end
end

都可以。两者都需要与此类似的一些RSpec:

describe Worker do
  subject(:worker) { described_class.new }

  describe "#perform" do
    subject(:perform) { worker.perform }

    let(:url) { "https://google.com" }

    it "raises exception" do
      expect { perform(url) }.to raise_error(MyFancyException)
    end
  end
end
本文链接:https://www.f2er.com/1849343.html

大家都在问