2017-06-20 10 views
1

SQLiteを実行し、フィクスチャを使用してcapybaraでブラウザを表示してテストするための適切なデータを読み込もうとしています。SQLite3:Capybara/Poltergeistのビジー例外

私のテストスイートでは、ドライバにMinitest w/CapybaraとPoltergeistを使用しています。私test_helper.rbファイルの関連部分は、そうのようになります。

require "minitest/reporters" 
reporters = [] 
reporters << Minitest::Reporters::SpecReporter.new 
Minitest::Reporters.use! reporters, ENV, Minitest.backtrace_filter 

require "minitest/rails/capybara" 
Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new(app, :js_errors => false) 
end 
Capybara.default_driver = :poltergeist 
Capybara.current_driver = :poltergeist 
Capybara.javascript_driver = :poltergeist 

は、しかし、私はこれが実行されているWebアプリケーションのユーザー・アクセス・レベルでのログインをスタブ簡単なテストがあり、その後、単にルートを訪問します。

しかし、私が使用している「ユーザーアクセススタビング」のように見えていません。これはちょうどユーザーモデルを返すCore::User.any_instance.stubs(etc...)のように見えます。

とにかく私が手に正確なエラーは次のとおりです。

ActiveRecord::StatementInvalid:   ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: commit transaction 

イムので器具を使用して、これは多分DBクリーナーの問題だろう(イムのみ現在あらかじめ作成された器具を使用してイムとして今それを使用していない)私は」 veは、rspecと工場の女の子との使用に慣れているだけで、minitestのDBクリーナーを使用したことはありません。

答えて

1

エラーは、別のDB接続ですでに書き込み用に開いているsqliteがあることを伝えています(複数のリーダーを扱うことができますが、一度に1つのライターしか処理できません)。実際のテストやスタブを表示しないので、問題がどこにあるのかを具体的に言うことはできませんが、要求があったときに他のデータベースアクセスを実行している可能性があります(たとえば、オブジェクトをプリロードしたスタブが戻るか、スタブが実行されるとロードされますか?)。

あなたのアプリがデータベースとしてsqliteを使用していない場合、アプリケーションが本番環境で使用するDBのテストにスワップします。さらに、スタブは機能テストでのアンチパターンです。適切なレコードを作成して対処するだけで済みます。

+0

私はコードを投稿することができますが、それは作業コードなので...私は本当にできません。テストは、文字通り、ページを開いてユーザーを読み込むことですが、別のテストでは正常に実行されます。しかし、もう一つのテストではminitestとUser-Agentの 'Ruby' page.driverとcapybaraを使用しました。私はカピバラでポルターガイストを使っています。 – msmith1114

+0

@ msmith1114ラピッドドライバを使用していると言うと、 'page.driver with capybara'の意味を理解できません。これは、すべてが単一のスレッドで同期的に実行されるため、巨大な違いです。ポラテジストを使用する場合、少なくとも2つのスレッド(テスト、アプリ)があり、ページが読み込まれ複数のDB接続がある場合には複数のリクエストを持つ可能性があります。あなたのアプリケーションが実際にsqliteを本物のスワップで使用していない場合、本番環境で使うものを使ってテストすると、はるかに簡単な時間が得られます。 –

+0

私たちのプロダクションDBはDB Cleanerが動作しない非常に古いSQLサーババージョンですので、毎回クリーンスレートに戻ることは基本的に不可能です。このsqliteの問題を回避する方法はありますか?あるいは、私はちょうど今のところ非ブラウザベースのテストに固執する必要があります。 'page.driver.header( 'User-Agent'、 'Ruby')'は、それがラックドライバを使用していると推測しています – msmith1114

関連する問題