1

Rails / オープンソース開発は初めてで、Test Unit を使用して、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

問題は、技術的に「system 'rails'」が完了しないため、テストが実行されないことです

次に、「rails s -d」を介してデタッチドモードを試しましたが、これはうまくいきません(SOの別の場所で別の質問として提起されました)、server.pidもtmpフォルダーに存在しません

最後に、システム「rails s &」を試しました。これの問題は、Rails サーバーが実際に準備が整う直前に、単体テストの実行が開始されることです。私が本当に必要としているのは、Rails Server を起動し、(ポーリングまたは何らかのコールバックによって) リクエストの受け入れを実際に開始する準備ができたときを把握する方法だと思います。

これに関するベスト プラクティスに関するアドバイスやガイダンスをいただければ幸いです。今後は CI のために Spork を使用することをお勧めしますが、今のところ、絶対に必要でない限り、手持ちのツール (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

私のテストの 1 つには、単に visit('/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>'
4

1 に答える 1