Написание тестов для стороннего работника
Я использую 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 для получения дополнительной информации.