【问题标题】:Write a feature Test using capybara when using sidekiq `perform_in` method使用 sidekiq `perform_in` 方法时使用 capybara 编写功能测试
【发布时间】:2021-04-27 03:50:05
【问题描述】:

我能找到的大部分相关内容都是关于测试后台作业是否安排在 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)

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

【问题讨论】:

    标签: ruby-on-rails rspec capybara sidekiq


    【解决方案1】:

    我假设您实际上并不想在测试期间等待 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 编写代码

    【讨论】:

    • 谢谢!有效!似乎最简单的方法是将Sidekiq::Testing.inline! 添加到规范文件中的before 块中。
    【解决方案2】:

    您可以结帐rspec-sidekiq

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

    【讨论】:

    • 但这是测试作业是否入队,这不是我要找的。作业执行后,我需要用 capybara 检查页面中的某些内容...
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多