6

これは、レール3.2.12にカピバラを使用した統合テストケースです。click_link 'New Log'ajax呼び出しです。ただし、開いたページは$()で始まり、\nや\log-logのようなjsエスケープがたくさんあります。

it "should work with link on show customer_comm_record page" do
      visit customer_customer_comm_records_path(@cust)
      #visit customer_customer_comm_record_path(@cust, @crecord)
      click_link @crecord.id.to_s     
      click_link 'New Log'
      save_and_open_page
end

また、ケースをでラップしようとしましたdescribe "", :js => true doが、エラーがどのように発生するか

`An error occurred in an after hook   ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked:`

コード実行によるエラーはありません。rspecの場合の何が問題になっていますか?手伝ってくれてありがとう。

4

1 に答える 1

8

サーバーがデータベースをロックしているため、テストの実行後にテストをクリーンアップできないようです。

JavaScriptなしでCapybaraを使用する場合、テストとサーバーはすべて単一のプロセスとスレッドで実行されます。これは、同じデータベース接続とトランザクションを共有できることを意味します。これは、RSpecが単純なデータベーストランザクションを使用して、テストの最後に変更をロールバックできることと、テストとサーバーの間にロックの競合が発生しない理由を意味します。

少し異なる方法で実行する場合:js => true、サーバーはテストとは別のスレッドまたはプロセスで起動するため、それぞれが別のデータベース接続とトランザクションを使用します。これは、RSpecがデフォルトでクリーンアップに使用するデータベーストランザクション戦略が機能しないことを意味します。また、あなたのケースではロックエラーを引き起こしています。

Capybara readmeはこの問題について説明し、この状況での代替手段としてdatabase_cleanergemを推奨しています。トランザクションではなく切り捨て戦略を使用するようにデータベースクリーナーを構成する必要があります

于 2013-03-10T11:04:33.983 に答える