这是我的设置:
空中制动器

require 'airbrake'

Airbrake.configure do |c|
  c.ignore_environments = [:test, :development]
  c.project_id = ENV['PROJECT_ID']
  c.project_key = ENV['PROJECT_KEY']
end

use Airbrake::Rack::Middleware

规范助手.rb
RSpec.configure do |config|
  config.before(:suite) do
    FactoryGirl.reload
    FactoryGirl.define do
      to_create { |instance| instance.save }
    end
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
    Airbrake.configure(:test) do |c|
      c.project_id = ENV['PROJECT_ID']
      c.project_key = ENV['PROJECT_KEY']
    end
  end

  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end
  end

  config.include FactoryGirl::Syntax::Methods
end

工人试验规范
require 'spec_helper'

RSpec.describe NotificationWorker do
  it "perform should call Airbrake#notify" do
    anotification_worker = LNotificationWorker.new
    airbrake_notification_worker.perform("some error message"))
    expect(Airbrake).to receive(:notify).with("some error message")
  end
end

我在其他(非sidekiq)测试中调用airbrake notify,他们发现适当的env变量很好。
但是,如果使用上述设置运行上述sidekiq测试,则会出现以下错误:
Airbrake::Error:
       the 'default' notifier isn't configured

但如果我将spec_helper.rb中的airbrake配置更改为:
Airbrake.configure do |c|
  c.project_id = ENV['PROJECT_ID']
  c.project_key = ENV['PROJECT_KEY']
end

在测试中可以找到env密钥。为什么会这样?

最佳答案

当您说Airbrake.configure(:test)时,并不意味着“为testRAILS_ENV配置空气制动”。而是创建一个非默认的named notifier。然后,您可以通过说:test向通知程序发送特定通知。但这不是关于开发/测试/生产,而是关于对通知进行分类。
所以问题是,您已经配置了一个名为Airbrake.notify("oops", {time: Time.now}, :test)的通知程序,但是您还没有配置一个名为test的通知程序,而default是airbrake希望在您不告诉airbrake的情况下使用的通知程序。这就是为什么当你简单地说default的时候你的规范就通过了。

关于ruby - 当我指定环境时,为什么RSpec在涉及Sidekiq的测试中找不到Airbrake env key ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34623599/

10-12 13:44