使用 sidekiq `perform_in` 方法时使用水豚编写功能测试

Write a feature Test using capybara when using sidekiq `perform_in` method

我能找到的大多数相关内容都是关于测试后台作业是否已安排,如 问题。

但是,我需要编写一个实际等待后台作业执行的功能测试,所以假设:

BatchWorker.perform_in(30.minutes)

我需要编写一个功能测试,根据将在 30 分钟内执行的作业的结果做出一些断言。怎么做?

更新

只是为了澄清...我不需要测试作业是否已排队,例如使用 rspec-sidekiq gem 你可以做类似

Awesomejob.perform_in 30.minutes, 'Awesome', true
# test with...
expect(AwesomeJob).to have_enqueued_sidekiq_job('Awesome', true).in(30.minutes)

这不是我需要的...我需要在作业执行后在带有水豚的页面上进行断言

您可以结帐rspec-sidekiq

Awesomejob.perform_in 30.minutes, 'Awesome', true
# test with...
expect(AwesomeJob).to have_enqueued_sidekiq_job('Awesome', true).in(30.minutes)

我假设您实际上并不想在测试期间等待 30 分钟,而是想立即执行作业(否则您只是睡了 30 分钟 - 但实际上对您没有任何好处) . Sidekiq 适配器有许多方法可以帮助解决这个问题,例如 Sidekiq::Testing.fake!Sidekiq::Testing.inline!。在您的情况下,听起来您希望使用 inline! 来立即执行作业。

require "sidekiq/testing"
Sidekiq::Testing.inline!

如果您使用了 fake!,那么您需要调用 drain_all 才能执行排队的作业。您可以在 https://sloboda-studio.com/blog/testing-sidekiq-jobs/ or in the sidekiq wiki and code at https://github.com/mperham/sidekiq/wiki/Testing and https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/testing.rb

阅读更多相关信息