Написание тестов для стороннего работника

Я использую rspec-sidekiq gem (https://github.com/philostler/rspec-sidekiq), чтобы помочь испытать рабочего, которого я пишу, но по какой-то причине мой тест продолжает терпеть неудачу.

Вот мой тест:

require 'spec_helper'

describe CommunicationWorker do
  it { should be_retryable false }

  it "enqueues a communication worker" do
    subject.perform("[email protected]", "[email protected]", [1,2,3])
    expect(CommunicationWorker).to have_enqueued_jobs(1)
  end
end

Вот ошибка:

 1) CommunicationWorker enqueues a communication worker
     Failure/Error: expect(CommunicationWorker).to have_enqueued_jobs(1)
       expected CommunicationWorker to have 1 enqueued job but got 0
     # ./spec/workers/communication_worker_spec.rb:9:in `block (2 levels) in <top (required)>'

Я основывал свой низкоуровневый тест на своем примере на своей вики, но он не работает для меня... любая причина, почему это не сработает?

Ответы

Ответ 1

Здесь можно проверить две вещи: асинхронное задание задания в очереди и выполнение задания.

Вы можете проверить выполнение задания путем создания экземпляра класса задания и вызова perform().

Вы можете проверить задание задания, вызвав perform_async() в классе заданий.

Чтобы проверить ожидания в вашем тесте, вы должны делать:

 it "enqueues a communication worker" do
    CommunicationWorker.perform_async("[email protected]", "[email protected]", [1,2,3])
    expect(CommunicationWorker).to have(1).jobs
  end

Однако это действительно просто проверка рамки Sidekiq, а не полезный тест. Я бы рекомендовал написать тесты для внутреннего поведения самой работы:

 it "enqueues a communication worker" do
    Widget.expects(:do_work).with(:some_value)
    Mailer.expects(:deliver)

    CommunicationWorker.new.perform("[email protected]", "[email protected]", [1,2,3])
  end

Ответ 2

Что такое метод тестирования? Попробуйте выполнить перенос существующего теста с помощью Sidekiq::Testing.fake! do <your code> end. Это обеспечит использование поддельной очереди. Если методы тестирования sidekiq являются "inline", рабочий будет выполнен сразу (и, следовательно, ваша очередь будет равна 0).

Отъезд: https://github.com/mperham/sidekiq/wiki/Testing для получения дополнительной информации.