You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RSpec测试Sidekiq Worker的perform方法调用逻辑以达100%覆盖率?

如何为Payments::Bitso::ProcessPaymentWorker编写RSpec测试以覆盖Disperse调用逻辑

要覆盖Payments::Bitso::ProcessPaymentWorker#perform中调用Users::Payments::Bitso::Disperse.new(options).call的逻辑,你可以通过模拟依赖类并验证调用行为来实现,具体步骤和代码示例如下:

  • 用instance_double创建Users::Payments::Bitso::Disperse的模拟实例,避免执行真实业务逻辑,仅验证调用动作
  • 设置RSpec期望,确保Disperse.new被传入正确参数,且call方法被触发
  • 执行worker的perform方法,断言期望是否满足
RSpec.describe Payments::Bitso::ProcessPaymentWorker, type: :worker do
  let(:test_options) { { payment_id: 1001, amount: 99.99, currency: "BTC" } }

  it "正确初始化并调用Users::Payments::Bitso::Disperse" do
    # 创建严格模拟的Disperse实例
    disperse_mock = instance_double(Users::Payments::Bitso::Disperse)

    # 期望Disperse.new接收指定参数并返回模拟实例
    expect(Users::Payments::Bitso::Disperse).to receive(:new).with(test_options).and_return(disperse_mock)
    # 期望模拟实例的call方法被调用一次
    expect(disperse_mock).to receive(:call)

    # 执行worker的perform方法
    described_class.new.perform(test_options)
  end
end

补充说明

  • 使用instance_double是为了做严格模拟:如果Users::Payments::Bitso::Disperse不存在new或call方法,测试会直接报错,避免隐性的拼写或定义错误
  • 若需要验证call方法的返回值或后续处理逻辑,可以在模拟实例上添加返回值(比如allow(disperse_mock).to receive(:call).return(true)),再扩展断言逻辑
  • 确保测试文件路径与worker路径对应,比如放在spec/workers/payments/bitso/process_payment_worker_spec.rb下

内容的提问来源于stack exchange,提问作者Carlos Gómez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:31:01