为什么请求类型测试中ActiveJob的InlineAdapter不生效?
问题答复
首先这是Rails的预期行为:Rails测试框架默认会对不同类型的测试自动适配ActiveJob队列适配器,type: :request类型的测试属于集成测试范畴,框架默认会强制将队列适配器覆盖为TestAdapter,方便开发者做任务入队、执行次数等相关断言,因此你在test.rb里的全局配置会被该类型测试的默认规则覆盖。
要让所有测试的perform_later都始终立即执行,可以选以下任意一种方案:
方案1:全局强制固定适配器
直接在测试入口文件(Minitest为test/test_helper.rb,RSpec为spec/rails_helper.rb)的末尾添加一行配置,优先级高于测试类型的默认覆盖规则:
ActiveJob::Base.queue_adapter = :inline
方案2:针对request类型测试单独配置
如果不想修改其他类型测试的默认适配器行为,仅调整request类型测试的配置,可以加前置钩子:
- RSpec 配置示例:
RSpec.configure do |config| config.before(:each, type: :request) do ActiveJob::Base.queue_adapter = :inline end end
- Minitest 配置示例:
class ActionDispatch::IntegrationTest setup do ActiveJob::Base.queue_adapter = :inline end end
如果后续需要在个别测试中临时使用TestAdapter做队列断言,在测试用例内手动修改适配器即可,测试运行完会自动恢复全局配置。
内容的提问来源于stack exchange,提问作者rept
相关产品推荐
相关产品推荐

