如何测试 Sidekiq 的 death handlers?

4
如何在RSpec中调用Sidekiq的death_handlersconfig/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  # ...

  config.death_handlers << lambda { |job, ex|
    throw "Retries exhausted on #{job['class']} #{job['jid']}: #{ex.inspect}."
  }
end

尝试了ActiveJob的retry_on建议,但没有成功。
还尝试使用rspec-sidekiqwithin_sidekiq_retries_exhausted_block,但失败了,提示作业类没有此方法。

1
将处理程序逻辑提取到单独的类/模块中并在隔离环境中进行测试怎么样?我认为,您不应该测试death_handlers机制本身——它属于第三方库,并在那里进行了测试... - Konstantin Strukov
1
主要原因是确保这在正确的上下文中运行,例如,job具有classjid字段。如果我在测试中自己传递这些参数,那就失去了目的。我现在可以查看job的样子,但它随时可能发生变化,我的测试也无法捕捉到这一点。 - thisismydesign
@thismydesign 不太确定我是否理解了。发送到死亡处理程序的“job”只是作为它被发送到sidekiq的反序列化作业定义。因此,如果您出于某种原因想要测试其结构,则可以在其他地方进行测试(例如,在计划作业的地方)-如果结构在那里与您的期望相匹配,则在死亡处理程序调用时也将不可避免地匹配它们。 - Konstantin Strukov
是的,但我必须知道那个并手动创建反序列化作业。如果作业或Sidekiq的内部发生更改,我也不确定它是否仍然有效。如果可能的话,只需在作业上触发死亡处理程序会更直接。因此有这个问题。 - thisismydesign
1个回答

0
为了测试death_handler的行为,我建议在本地失败一个作业,并检查您的标准输出,以查看您的death_handler过程是否按预期运行。
您可以通过在本地运行Sidekiq,然后同时运行一个您知道会失败的作业(例如通过rails控制台引发异常),来实现这一点。您应该在rails控制台窗口中看到death_handler过程的输出。
关于您的声明:

也尝试了rspec-sidekiq的within_sidekiq_retries_exhausted_block,但是它失败了,说作业类没有这个方法。

这是因为ActiveJob不支持sidekiq_retries_exhausted块。因此,设计用于测试sidekiq_retries_exhausted块的within_sidekiq_retries_exhausted_block方法将不会测试任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接