为什么这个Sidekiq假测试没有增加作业阵列的大小?

时间:2016-01-06 00:26:29

标签: ruby rspec sidekiq airbrake

我使用https://github.com/mperham/sidekiq/wiki/Testing中的虚假测试对sidekiq测试进行了以下测试设置。

spec_helper.rb

require 'sidekiq/testing'
Sidekiq::Testing.fake!

# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
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 do |c|
      c.project_id = ENV['AIRBRAKE_PROJECT_ID']
      c.project_key = ENV['AIRBRAKE_PROJECT_KEY']
    end
  end

  config.before(:each, job: true) do
    Sidekiq::Worker.clear_all #make sure jobs don't linger between tests
  end

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

  config.include FactoryGirl::Syntax::Methods
end

notification_spec.rb

require 'spec_helper'

RSpec.describe NotificationWorker do
  it "perform should call Airbrake#notify", job: true do
    notification_worker = NotificationWorker.new
    message = "This is your error message"
    expect { notification_worker.perform(message) }.to change(NotificationWorker.jobs, :size).by(1)
  end
end

notification_worker.rb

class NotificationWorker
  include Sidekiq::Worker
  sidekiq_options queue: :high

  def perform(message)
    Airbrake.notify(message)
  end
end

然而,为什么我收到以下错误消息:

Failure/Error: expect { notification_worker.perform(message) }.to change(NotificationWorker.jobs, :size).by(1)
       expected #size to have changed by 1, but was changed by 0

似乎job数组应该增加1.发生了什么?这是由RSpec和Database Cleaner之间的交互引起的线程问题吗?

1 个答案:

答案 0 :(得分:2)

因为它直接调用了perform方法而不是Sidekiq的API。

尝试NotificationWorker.perform_async(message)