如何在运行Capybara时配置puma?

Joh*_*hir 9 ruby-on-rails capybara puma

我想在运行Capybara测试时调整puma配置.更改.env,.env.test(我使用dotenv)或config/puma.rb中的设置无效.

我在哪里可以更改配置?

Rails 5.1,poltergeist 1.15.0,capybara 2.14.0,puma 2.8.2

Tho*_*ole 12

通常使用Capybara,您可以在register_server块中配置服务器.:puy服务器定义Capybara提供的是

Capybara.register_server :puma do |app, port, host|
  require 'rack/handler/puma'
  Rack::Handler::Puma.run(app, Host: host, Port: port, Threads: "0:4")
end
Run Code Online (Sandbox Code Playgroud)

如果您正在使用Rails 5.1系统测试,它在其上添加了一层抽象,服务器配置在ActionDispatch :: SystemTesting :: Server#register中完成,定义为

def register
  Capybara.register_server :rails_puma do |app, port, host|
    Rack::Handler::Puma.run(app, Port: port, Threads: "0:1")
  end
end
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都应该能够覆盖当前服务器注册之一

Capybara.register_server :rails_puma do |app, port,host|
  Rack::Handler::Puma.run(app, ...custom settings...)
end
Run Code Online (Sandbox Code Playgroud)

或配置自己的

Capybara.register_server :my_custom_puma do |app, port, host|
  Rack::Handler::Puma.run(app, ...custom settings...)
end

Capybara.server = :my_custom_puma
Run Code Online (Sandbox Code Playgroud)

  • 作为记录,我可以让它工作的唯一方法是重新定义我自己的服务器(`:my_custom_puma`)并将它放在 application_system_test_case.rb 的底部。application_system_test_case.rb 或 test_helper.rb 中的任何其他位置都不起作用,并且尝试重新定义 `:rails_puma` 也不起作用。 (2认同)
  • @Epigene如果您想要做的只是沉默Puma,并且您正在使用当前版本的Capybara,您应该能够执行`Capybara.server =:puma,{Silent:true}`或设置`ActionDispatch ::如果使用Rails系统测试,SystemTesting :: Server.silence_puma = true`. (2认同)

err*_*ric 7

在 中ApplicationSystemTestCase,您可以通过传递options:pumaRails 中使用的默认服务器来进行配置setup

AFAIK,这适用于任何选项,但我只使用过

  • Silent: true 使 puma 启动输出静音
  • Thread: '1:1' 配置 puma 进程只使用一个线程

以下是我如何设置 Rails 系统测试以在 docker 容器内运行:

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400], options: { url: "http://selenium:4444/wd/hub" }

  def setup
    Capybara.server_host = '0.0.0.0' # bind to all interfaces
    Capybara.server = :puma, { Silent: true, Threads: '1:1' }
    host! "http://#{IPSocket.getaddress(Socket.gethostname)}"
    super
  end
end
Run Code Online (Sandbox Code Playgroud)