ruby-on-rails - 使用 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)
这不是我需要的......我需要在执行作业后使用水豚在页面上做出断言。
解决方案
我假设您实际上并不想在测试期间等待 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
推荐阅读
- c# - Angular 中无法读取来自 C# WebAPI 的错误 JSON 格式
- python - 为什么在构建 docker 时出现“conda: command not found”,而在基本映像中,“conda”命令工作正常?
- flutter - 具有空安全性的 Rtmp 发布者包
- javascript - 如何在useState reactJs的特定索引和数组中推送项目
- docusaurus - Docusaurus 2 - 粘性公告横幅
- oracle - 更改 APEX_MAIL 包
- flutter - 参数不匹配的闭包调用:函数'_TaskTileState.checkboxCallback'
- json - 将 JSON 文件导入我的 postgreSQL DB - INSERT 的表达式比目标列多
- c++ - 当元素具有类成员 Boost Concurrent Queue 时无法调整向量的大小
- ios - 如何将对象传递给新的 SwiftUI 视图