【问题标题】:How can I check the code in the exception block?如何检查异常块中的代码?
【发布时间】:2018-11-07 16:28:35
【问题描述】:

我有 Sidekiq 工人。

class DeliverSmsMessageWorker
  include Sidekiq::Worker

  def perform(sms_message_id)
    ....
  rescue StandardError => e
    Rails.logger.error("SmsMessageWorker ERROR: #{e}")
    Bugsnag.notify(e)
  end
end

我编写了规范,但是当我尝试测试 Rails.looger 时出现错误。

describe DeliverSmsMessageWorker, type: :worker do
  subject(:worker) { DeliverSmsMessageWorker }

  context 'on exceptions' do
    let(:error) { StandardError.new('test exception') }

    before do
      allow(worker).to receive(:perform_async).with(sms_message.id).and_raise(error)
    end

    it 'message in logger' do

      Sidekiq::Testing.inline! do
        worker.perform_async(sms_message.id)
        expect(Rails.logger).to receive(:error).and_call_original
      end
    end
  end
end

当我运行这个规范后,我得到了错误。但为什么呢?

测试这两行有什么意义吗?

1) DeliverSmsMessageWorker on exceptions message in the logger
 Failure/Error: worker.perform_async(sms_message.id)

 StandardError:
   test exception

【问题讨论】:

  • 尝试将expect(Rails.logger).to...移动到第一行,在worker.perform_async...之前
  • 正如我在您之前的问题中所说的那样 - 在您调用您正在测试的方法之前,必须消除模拟期望。
  • 我做到了,但没有。
  • 如果你用expect(worker)...替换allow(worker)...
  • 但我不需要这个检查,我需要检查Rails.logger 我想知道它是否会向日志发送消息。 :)

标签: ruby-on-rails rspec rspec-rails rspec3 rspec-sidekiq


【解决方案1】:

也许你应该在这里使用raise_error 的块语法:

  Sidekiq::Testing.inline! do
    expect { worker.perform_async(sms_message.id) }.to raise_error { |error|
      expect(Rails.logger).to receive(:error).and_call_original
    }
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多