如何解决使用 sidekiq `perform_in` 方法时使用水豚编写功能测试
我能找到的大多数相关内容都是关于测试后台作业是否像 this 问题一样被安排。
但是,我需要编写一个真正等待后台作业执行的功能测试,所以我们说:
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)
这不是我需要的......我需要在执行作业后在带有水豚的页面上进行断言。
解决方法
我假设您实际上不想在测试期间等待 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/Testing 和 https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/testing.rb
您可以结帐rspec-sidekiq
Awesomejob.perform_in 30.minutes,'Awesome',true
# test with...
expect(AwesomeJob).to have_enqueued_sidekiq_job('Awesome',true).in(30.minutes)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。