RSpec-Sidekiq测试异常:RequestJob被错误分配至默认队列
问题分析与解决
你的核心矛盾是:RSpec控制台明确显示RequestJob入队到Test(critical)队列,但expect(RequestJob).to be_processed_in :critical断言失败,提示实际队列是default。
这是因为**be_processed_in匹配器默认是验证Job类的全局队列配置,而非已入队Job实例的实际队列**。以下是具体解决办法:
1. 改用实例级匹配器验证已入队的Job
不要直接对Job类断言,而是用have_enqueued_job匹配器定位到实际入队的Job实例,再验证它的队列:
it "the request and polling jobs are enqueued" do post "/v1/sessions/#{sessions(:one).id}/do_it", headers: { 'Authorization': 'Bearer ' + retailer_private_token }, params: { session: { session_customer_attributes: { email: customers(:one).email } } } expect(PollingJob).to be_processed_in :default # 改用实例级断言 expect(have_enqueued_job(RequestJob)).to be_processed_in(:critical) end
2. 检查测试环境的队列配置
确认config/environments/test.rb里的Sidekiq配置是否有队列覆盖:
- 确保
config.active_job.queue_adapter = :sidekiq已正确设置 - 检查是否有全局队列前缀或重写逻辑,这类配置可能干扰匹配器对实际队列的判断:
# 示例:若存在这类全局配置,需确认是否影响队列名称解析 Sidekiq.configure_client do |config| config.queue_name_prefix = 'test' end
3. 排查Job是否被动态修改队列
确认RequestJob在入队时没有被set(queue: ...)覆盖默认队列,比如控制器里的入队代码:
# 错误示例:这里强行指定default队列,会覆盖Job类的queue_as设置 RequestJob.set(queue: :default).perform_later(scoring)
如果存在这种情况,要么修改入队逻辑遵循类的队列配置,要么调整测试断言的队列值。
内容的提问来源于stack exchange,提问作者user3086596
相关产品推荐
相关产品推荐

