我正在使用RSpec,Capybara和Selenium来测试我的本地Rails应用程序。水豚本身工作正常。我的问题是我在大多数应用程序中使用强制SSL连接。
我现在的解决方法是将Capybara配置为javascript测试,如下所示:
Capybara.register_driver :selenium_profile do |app|
profile = Selenium::WebDriver::Firefox::Profile.new
profile.secure_ssl = false
profile.assume_untrusted_certificate_issuer = true
Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile)
end
Capybara.javascript_driver = :selenium_profile
Capybara.run_server = false
Capybara.server_port = 3001
Capybara.app_host = "https://localhost:%d" % Capybara.server_port
仅当我在端口3001上使用有效的本地SSL证书独立启动服务器时才有效。在实践中,这很烦人,通常只是我不喜欢的手动依赖。
有人知道更简洁的解决方法吗?之一:
1)如何配置Capybara的内部服务器以查找和使用我的本地SSL证书?或
2)如何为javascript测试禁用强制SSL,或
3)如何在任何javascript测试之前自动启动本地服务器?
非常感谢任何帮助。
答案 0 :(得分:4)
您可以通过将接受应用程序和端口的块传递给Capybara.server来告诉Capybara如何启动服务器。默认只调用Rake :: Handler :: WEBrick.run:
# This is the default setting
Capybara.server = {|app, port| Capybara.run_default_server(app, port)}
def run_default_server(app, port)
require 'rack/handler/webrick'
Rack::Handler::WEBrick.run(app, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0))
end
只要您传递给服务器的任何内容都接受应用程序和端口,您就可以定义任何您喜欢的服务器启动代码。
Rack :: Handler :: WEBrick将其大部分选项直接传递给WEBrick :: HTTPServer,因此您可以传递SSL配置选项(SSLEnable,SSLCertificate和SSLPrivateKey,取from the docs)并启动服务器像这样的东西:
def run_ssl_server(app, port)
require 'rack/handler/webrick'
require 'webrick/https'
certificate = OpenSSL::X509::Certificate.new File.read '/myapp/some_directory/certificate.pem'
key = OpenSSL::PKey::RSA.new File.read '/myapp/some_directory/key.pem'
opts = {
:Port => port,
:AccessLog => [],
:Logger => WEBrick::Log::new(nil, 0),
:SSLEnable => true,
:SSLCertificate => certificate,
:SSLPrivateKey => key
}
Rack::Handler::WEBrick.run(app, opts)
end
# Elsewhere in your test/spec helper
Capybara.server = {|app, port| run_ssl_server(app, port)}