如何在集成测试中启动rails服务器?

时间:2013-09-30 19:57:00

标签: ruby-on-rails ruby-on-rails-3

我是Rails /开源开发的新手,我使用测试单元与Capybara / WebDriver一起编写集成测试

在执行集成测试之前,如何确保Rails服务器正在运行并准备就绪?

我在test_helper.rb中尝试了以下内容:

server_running = false
path = File.join(Rails.root, "tmp", "pids", "server.pid")
if  FileTest.exist? path
  begin
    pid = File.read(path).to_i
    server_running = true if Process.getpgid pid
  rescue Errno::ESRCHfound
  end
end

if !(server_running)
  puts "Starting Rails Server"
  system "rails s"
else
  puts "Rails Server already started"
end

问题是测试永远不会运行,因为技术上和#34;系统' rails s'"永远不会完成

所以我接下来通过" rails s -d"尝试了分离模式。但这对我不起作用(在SO上的其他地方提出单独的问题)并且tmp文件夹中不存在server.pid

所以最后我尝试了系统" rails s&"。问题是,我的单元测试在Rails服务器实际准备好之前立即开始执行。我想我真正需要的是一种启动Rails服务器的方法,并在它准备开始接受请求时弄清楚(通过轮询或一些回调)

了解有关此方面的最佳做法的任何建议和指导。我已经建议将Spork用于CI,但是现在,除非绝对必要,否则我只想坚持使用我的工具(TestUnit,Capybara,WebDriver)

编辑:在我的test_helper.rb中,我在文件末尾有以下内容

class ActionDispatch::IntegrationTest
  include Capybara::DSL

  def setup
    Capybara.default_driver = :webkit
    Capybara.run_server = true 
    Capybara.server_port = 3001
    Capybara.app_host = "http://localhost:3001"
  end


  def teardown
    Capybara.reset_sessions!
  end
end

我的一个测试只是访问(' / linkedin / importprofile') - 这样做会产生以下异常:

  1) Error:
test_should_display_previously_imported_LinkedIn_data_in_Basic_Profile_fields(LinkedinTest):
Capybara::Webkit::InvalidResponseError: Unable to load URL: http://localhost:3001/linkedin/importprofile because of error loading http://localhost:3001/linkedin/importprofile: Unknown error
    /var/lib/gems/1.9.1/gems/capybara-webkit-1.0.0/lib/capybara/webkit/browser.rb:215:in `check'
    /var/lib/gems/1.9.1/gems/capybara-webkit-1.0.0/lib/capybara/webkit/browser.rb:152:in `command'
    /var/lib/gems/1.9.1/gems/capybara-webkit-1.0.0/lib/capybara/webkit/browser.rb:18:in `visit'
    /var/lib/gems/1.9.1/gems/capybara-webkit-1.0.0/lib/capybara/webkit/driver.rb:29:in `visit'
    /var/lib/gems/1.9.1/gems/capybara-2.1.0/lib/capybara/session.rb:193:in `visit'
    /var/lib/gems/1.9.1/gems/capybara-2.1.0/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
    /home/blue18hutthutt/Sites/pd_frontend/test/integration/linkedin_test.rb:31:in `block in <class:LinkedinTest>'

1 个答案:

答案 0 :(得分:3)

您永远不需要手动启动Rails服务器来运行测试。在需要时,驱动程序将自动启动一个并在测试运行完成时将其关闭。默认的Rack :: Test驱动程序甚至不需要服务器进程,因为它直接与Rack连接。

如果您在删除手动服务器启动代码后仍然遇到问题,我首先要确保您已将Capybara设置为使用Test :: Unit as described in this section of the README。 (修改:虽然看起来有,但手动指定server_portapp_host可能会干扰某些内容,如下面的评论所述。)