ruby-on-rails 如何防止Rails并行测试和Sidekiq调用Redis

t1rydlwq  于 2023-06-07  发布在  Ruby
关注(0)|答案(1)|浏览(159)

我有一个Rails应用程序,它使用Sidekiq进行异步作业。我设置了并行测试来加速我的测试管道。这很好,但我有一个大问题:Redis遇到了Sidekiq作业的瓶颈,这些作业试图在那里排队。
我一直看到这些错误:

Redis::CannotConnectError:
Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)

我正在运行一些旧版本的宝石,也使用Sidekiq debounce(不确定这是否是原因)
sidekiq (5.2.1)sidekiq-debounce (1.1.0)rspec-sidekiq (3.0.3)
我的印象是,rspec-sidekiq可以通过使用以下两种方法之一来存根对Redis的调用:Sidekiq::Testing.inline!Sidekiq::Testing.fake!来分别内联运行作业或将它们推送到数组。然而,这两种选择都不起作用。我错过了什么?
我尝试设置测试环境来伪造或内联作业,如:

require "sidekiq/testing"

Sidekiq::Testing.inline!

require "sidekiq/testing"

Sidekiq::Testing.fake!

然后我甚至检查了一些测试,以确保这是由以下命令设置的:

puts "SIDEKIQ MODE ENABLED: #{Sidekiq::Testing.enabled?}"
puts "SIDEKIQ MODE FAKE: #{Sidekiq::Testing.fake?}"
puts "SIDEKIQ MODE INLINE: #{Sidekiq::Testing.inline?}"
puts "SIDEKIQ MODE DISABLED: #{Sidekiq::Testing.disabled?}"

它返回了我所期望的,但我仍然得到了Redis连接拒绝。
我还尝试将各个部分 Package 在块中,如:

Sidekiq::Testing.fake! do
 # some code
end
lrl1mhuk

lrl1mhuk1#

所以我想我知道哪里出了问题或者该改什么了。我们将Sidekiq与Sidekiq-debounce沿着使用,我认为这实际上是拦截了基本的Sidekiq异步调用,因此即使我将它们设置为Sidekiq::Testing.fake!Sidekiq::Testing.inline!,这也不会影响使用SomeWorker.perform_in()调用的作业
我在我们的sidekiq.rb初始化器中结束了对测试环境的去抖动中间件的禁用:

unless Rails.env.test?
  Sidekiq.configure_client do |config|
    config.client_middleware do |chain|
      chain.add Sidekiq::Debounce
    end
  end
end

if Rails.env.test?
  require 'sidekiq/testing'
  Sidekiq::Testing.fake!
end

再次运行管道,不再看到Redis连接问题。

相关问题