如何用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
相关产品推荐
相关产品推荐

