ruby-on-rails - Rspec 测试 retry_on
问题描述
我有这样的工作
class CrawlSsbHistory < BaseJob
retry_on(Ssb::SessionExpired) do
Ssb::Login.call
end
def perform
response = Ssb::Client.get_data
SsbHistory.last.destroy
end
end
我有这样的测试
it "retries the job if session error" do
allow(Ssb::Client).to receive(:get_data).and_raise(Ssb::SessionExpired)
allow(Ssb::Login).to receive(:call)
described_class.perform_now # it is CrawlSsbHistory
expect(Ssb::Login).to have_received(:call)
end
CrawlSsbHistory 是一项抓取一些数据的工作。它调用 Ssb::Client.get_data 来获取数据。
在 Ssb::Client.get_data 内部,如果会话过期,我会提出 Ssb::SessionExpired。所以我可以使用 retry_on 捕获作业中引发的错误。然后,如果发生这种情况,我想尝试这份工作。
但我有这样的错误
(Ssb::Login (class)).call(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
作业没有调用retry_on 吗?还是我测试错了?如何制作 rspec 来测试 retry_on 是否正常工作并调用 Ssb::Login.call?
解决方案
retry_on
每次重试时不会立即调用该块。只有当尝试用尽时。否则,它只会重新安排工作。
从文档:
如果自定义逻辑的重试尝试失败,您还可以传递一个将被调用的块,而不是让异常冒泡。生成此块时,作业实例作为第一个参数,错误实例作为第二个参数。
推荐阅读
- php - Wordpress:如何通过 REST API 使用 Wordpress 帖子格式
- python - 在kivyMD的MDToolbar中更改图标的颜色?
- symfony - Symfony 5 / Mercure > 私人更新。获取 CORS
- javascript - 为什么在这里创建一个新数组而不是清空旧数组会导致问题?
- ssl - Mosquitto websockets ERR_CONNECTION_REFUSED letencrypt
- php - Laravel 迁移“连接被拒绝”[2002] | 数据库正确 | 全新安装
- c# - 如何在不同的脚本中影响 bool
- swiftui - 观察 SwiftUI 中的帧变化
- javascript - JavaScript 将隐藏数据添加到 Object
- c# - SQLite 获取 int 而不是 float