我是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>'
答案 0 :(得分:3)
您永远不需要手动启动Rails服务器来运行测试。在需要时,驱动程序将自动启动一个并在测试运行完成时将其关闭。默认的Rack :: Test驱动程序甚至不需要服务器进程,因为它直接与Rack连接。
如果您在删除手动服务器启动代码后仍然遇到问题,我首先要确保您已将Capybara设置为使用Test :: Unit as described in this section of the README。 (修改:虽然看起来有,但手动指定server_port
和app_host
可能会干扰某些内容,如下面的评论所述。)