【问题标题】:Ensuring Rollbar has reported error with RSpec确保 Rollbar 报告了 RSpec 错误
【发布时间】:2015-09-11 16:52:48
【问题描述】:

我班级中的逻辑有时使用Rollbar.silenced 来忽略某些异常(因此它们不会被报告)。

我正在尝试编写一个测试来确保滚动条实际报告错误。

it 'does not mute rollbar' do
        expect(Rollbar).not_to receive(:silenced)
        expect(Rollbar).to receive(:error).with(any_args).and_call_original
        expect { query }.to raise_error(unknown_exception)
end

很遗憾rollbar在:error:critical:warning等方法中报告未获救的错误时不使用。

我在滚动条sourcecode 中看到report_exception_to_rollbarcall_with_rollbar,它们用Rollbar.scoped 包裹。

所以我尝试使用以下方法对其进行测试:

expect(Rollbar).to receive(:scoped).with(any_args).and_call_original

但它也告诉我:

 Failure/Error: expect(Rollbar).to receive(:scoped).with(any_args).and_call_original
       (Rollbar).scoped(*(any args))
           expected: 1 time with any arguments
           received: 0 times with any arguments

如何确保异常被rollbar捕获并用rspec测试?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rspec rollbar


    【解决方案1】:

    您要确保运行的行是Rollbar.log call in exception_reporter.rb。 (Rollbar.errorRollbar.warning 等只是 Rollbar.log 的包装。)

    试试这个:

    expect(Rollbar).to receive(:log).with(any_args).and_call_original

    【讨论】:

    • 已经试过了。不起作用。 ` 预期:1 次,收到任何参数:0 次,收到任何参数`
    • 错误是因为expect { query }.to raise_error(unknown_exception) 通过了 100%。您认为这可能与测试环境有关吗?
    • 啊,可能是因为在测试环境中禁用了 Rollbar。标准初始化程序会这样做:github.com/rollbar/rollbar-gem/blob/master/lib/generators/… 您可以尝试从 config/initializers/rollbar.rb 中删除这些行,或者在运行此特定测试之前设置 config.enabled = true
    • Rollbar.configuration.enabled=> true 但是仍然没有调用 :log 方法
    • 另外:启用 Rollbar 我可能不想再.and_call_original :)
    【解决方案2】:

    log 对我不起作用,但 error 对我有用。这是 Rails 应用程序中的 ApplicationJob 示例。

    describe "ApplicationJob" do
      describe "rollbar" do
        context "when rollbar is included" do
          before do
            class EasyJob < ApplicationJob
              def perform(*)
              end
            end
    
            allow_any_instance_of(EasyJob).to receive(:perform).and_raise(StandardError) # rubocop:disable RSpec/AnyInstance
          end
    
          it "makes a call to rollbar" do
            expect(Rollbar).to receive(:error).with(any_args)
            expect { EasyJob.perform_now }.to raise_error(StandardError)
          end
        end
    
        context "when rollbar is NOT included" do
          before do
            class HardJob < ActiveJob::Base
              def perform(*)
              end
            end
    
            allow_any_instance_of(HardJob).to receive(:perform).and_raise(StandardError) # rubocop:disable RSpec/AnyInstance
          end
    
          it "does NOT make a call to rollbar" do
            expect(Rollbar).not_to receive(:error)
            expect { HardJob.perform_now }.to raise_error(StandardError)
          end
        end
      end
    end
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2018-11-07
      • 2013-01-21
      • 2022-09-27
      相关资源
      最近更新 更多