使用 Minitest 测试 ActiveJob 不会命中 Sidekiq 队列

Testing ActiveJob with Minitest doesn't hit Sidekiq queue

在 Rails 4.2 我有以下 ActiveJob 测试:

test/jobs/import_job_test.rb

require 'test_helper'

class ImportJobTest < ActiveJob::TestCase

  def setup
    @response = ImportJob.perform_later "'testing Sidekiq queue jobs'"
  end

  test "enqueued jobs" do
    assert_enqueued_jobs 1
    clear_enqueued_jobs
    assert_enqueued_jobs 0
  end

  test "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper" do
    assert_equal ["'testing Sidekiq queue jobs'"], @response.arguments
  end

  test "a second new job has been enqueued with the given arguments" do
    assert_enqueued_jobs 1
    assert_enqueued_with(job: ImportJob, args: ["'queuing a second job'"], queue: 'default') do
      ImportJob.perform_later "'queuing a second job'"
    end
    assert_enqueued_jobs 2
  end

end

运行 测试变绿:

$ rake test test/jobs/import_job_test.rb
Started with run options --seed 35322

  4/4: [===================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.01380s
4 tests, 7 assertions, 0 failures, 0 errors, 0 skips

但永远不要真正接触 Sidekiq 队列。当 Sidekiq 关闭时我也会变绿,这是我不想要的。当然 运行 在控制台队列被咬了。

如何指定在测试模式下真正命中队列?

使用像 ActiveJob 这样的 API 的原因是允许您将代码写入抽象 API 以便您可以更改适配器。换句话说,您的 ActiveJob classes 应该能够从 Sidekiq 迁移到 Que,而无需对您的代码进行任何更改。正因为如此,ActiveJob::TestCase uses a test adapter 这使得断言工作行为更容易。

就是说,如果您真的想让您的作业进入 运行 队列,您应该相应地配置您的测试环境并继承不使用 [=16] 的测试 class =].