【问题标题】:Testing that Sidekiq received correct delayed job测试 Sidekiq 是否收到正确的延迟作业
【发布时间】:2013-10-30 15:50:00
【问题描述】:

在我的用户模型内部,我正在调用延迟方法:

class User < ActiveRecord::Base
  def self.import_items
    ...
    User.delay.keep_only_user_cars(1) # "1" is just for testing
  end
end

我正在尝试像这样测试它(使用rspec-sidekiq gem):

expect(Sidekiq::Extensions::DelayedClass).to have_enqueued_job("keep_only_user_cars", 1)     

这是我得到的:

Failure/Error: expect(Sidekiq::Extensions::DelayedClass).to have_enqueued_job("keep_only_user_cars", 1)
  expected to have an enqueued Sidekiq::Extensions::DelayedClass job with arguments ["keep_only_user_cars", 1] but none found
  found: [["---\n- !ruby/class 'User'\n- :keep_only_user_cars\n- - 1\n"]]

这基本上可以,只是格式有点不同。

如何修复此测试以确保 Sidekiq 完全接收到具有此属性的此方法?

【问题讨论】:

    标签: ruby-on-rails rspec sidekiq rspec-sidekiq


    【解决方案1】:

    根据the docs,延迟扩展在redis 中发送整个对象,而不仅仅是值。如果你想测试那个对象,你需要使用 YAML.dump(object):

    expected = YAML.dump([User,:keep_only_user_cars,1])
    expect(Sidekiq::Extensions::DelayedClass).to have_enqueued_job(expected)
    

    【讨论】:

    • 拯救了我的一天 :) 唯一的解决方法:我发现方法 args 必须在数组中:expected = YAML.dump([User,:keep_only_user_cars,[1]])
    猜你喜欢
    • 2018-03-25
    • 2017-12-15
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多