首页 > 解决方案 > 使用 sidekiq `perform_in` 方法时使用 capybara 编写功能测试

问题描述

我能找到的大多数相关内容都是关于测试后台作业是否像这个问题一样安排。

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

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)

这不是我需要的......我需要在执行作业后使用水豚在页面上做出断言。

标签: ruby-on-railsrspeccapybarasidekiq

解决方案


我假设您实际上并不想在测试期间等待 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/或在 sidekiq wiki 和https://github.com/mperham/sidekiq/wiki/Testinghttps的代码中阅读更多相关信息://github.com/mperham/sidekiq/blob/master/lib/sidekiq/testing.rb


推荐阅读