如何测试Sidekiq任务的失败?

11
在 Sidekiq 中,如果出现异常,作业将被放置在重试队列中。由于任务是异步运行的,因此 MyWorker.perform_async(...) 永远不会抛出在任务代码中生成的异常。
然而,在测试中,发生在任务中的异常并不会使任务被放置在重试队列中。异常会从 perform_async 冒泡出来。因此,在测试中发生的事情是在实际运行代码时不可能发生的。
那么,如何最好地测试触发可能失败并被放置在重试队列中的作业的代码呢?
请注意,以下内容在测试中似乎没有任何效果:
Sidekiq.default_worker_options = { :retry => true}
1个回答

5

这个设计是有意为之的,因为你不应该这样做。你不应该测试Sidekiq功能,而是测试自己的代码,不要测试其他库/框架提供的功能。


1
我没有测试Sidekiq。我的代码是a=f(x); Worker.perform_async(a); y(a)。我无法在测试环境中运行该代码,因为任何导致任务失败的数据都无法使用。如果您认为有意义,我很乐意在GitHub上讨论并创建拉取请求。如果不是这样,那么这是您的项目,我感谢您的工作。 - Mark Bolusmjak
1
这是因为你正在运行 inline 模式。请在测试中使用 fake 模式。https://github.com/mperham/sidekiq/wiki/Testing - Mike Perham
25
沿着同样的思路,如果测试中没有重试机制,那么如何进行端到端测试呢?其中包含一个必须在超时后重试直至成功的外部终端点。成功会导致其他操作。这不是在测试Sidekiq,但是重试是成功流程的一部分,可以在测试环境之外正常工作。你可以只测试Sidekiq是否发送了正确的信息,但那样就不是端到端测试了。 - Gerry
3
有多种方法可以使用Sidekiq定义自定义错误处理,这绝对是您想要测试的代码。 - thisismydesign

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