ruby - 使用 RSpec 3 测试 sidekiq perform_in

标签 ruby rspec sidekiq rspec-sidekiq

RSpec 3 和 sidekiq 3.2.1。我已经正确设置了 sidekiq 和 rspec-sidekiq。

假设我有一个名为 WeatherJob 的 worker,它将天气状态从 sunny 更改为 rainy:

class WeatherJob
  include Sidekiq::Worker

  def perform record_id
    weather = Weather.find record_id

    weather.update status: 'rainy'
  end
end

我这样使用这个 worker:

WeatherJob.perform_in 15.minutes, weather.id

在规范中,我使用 Timecop 来模拟时间:

require 'rails_helper'

describe WeatherJob do
  let(:weather) { create :weather, status: 'sunny' }
  let(:now)     { Time.current }

  it 'enqueue a job' do
    expect {
      WeatherJob.perform_async weather.id
    }.to change(WeatherJob.jobs, :size).by 1
  end

  context '15 mins later' do
    before do
      Timecop.freeze(now) do
        Weather.perform_in 15.minutes, weather.id
      end
    end

    it 'update to rainy' do
      Timecop.freeze(now + 16.minutes) do
        expect(weather.status).to eq 'rainy'
      end
    end
  end
end

我可以看到 Weather.jobs 数组中有工作。时间是正确的 16 分钟后。但是它没有执行作业?有什么建议吗?谢谢!

最佳答案

Sidekiq 具有三种测试模式:disabledfakeinline。默认值为 fake,它只是将所有作业推送到作业数组中,这就是您所看到的行为。 内联 模式立即运行作业而不是将其排队。

要强制 Sidekiq 在测试期间内联运行作业,请将您的测试代码包装在 Sidekiq::Testing.inline! block 中:

before do
  Sidekiq::Testing.inline! do
    Timecop.freeze(now) do
      Weather.perform_in 15.minutes, weather.id
    end
  end
end

有关测试 Sidekiq 的更多信息,请参阅 official Testing wiki page .

关于ruby - 使用 RSpec 3 测试 sidekiq perform_in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25245417/

相关文章:

ruby - 如何防止将位置参数扩展为关键字参数?

ruby-on-rails - Rails 3 升级 : Generate routing tests

ruby-on-rails - 仅在开发中缓慢 Sidekiq

ruby-on-rails - "Good"剥皮分数

ruby - 在 Ruby 项目中同时拥有 .rvmrc 和 .ruby-version 是一种不好的做法吗?

arrays - 从数组中获取对象

testing - RSpec:测试 rescue_from

ruby-on-rails - 运行规范时对象不会出现在测试数据库中

multithreading - Docker sidekiq 比原生操作系统慢得多

ruby-on-rails-4 - sidekiq - 警告 : ArgumentError: wrong number of arguments (given 0, 预计 2..3)