10

キュウバーを使用して統合テストを作成し、Database Cleanerを使用してdbをきれいに保ちます。私のテストはJavascriptを必要としないので、すべてが完璧に機能します。カピバラウェブキットのデータベースクリーナーの問題

Capybara webkitを使用してこれらの最後のテストを合格させることはできますが、dbはまったくクリーニングされません。ここで

機能/サポート/ env.rbファイルです:私はカピバラによって使用されますが、それはうまくいきませんでしたいるドライバを確認するthisに似た何かをしようとした

require 'simplecov' 
SimpleCov.start 'rails' 
require 'cucumber/rails' 

Capybara.default_selector = :css 
Capybara.javascript_driver = :webkit 

begin 
    require 'database_cleaner' 
    require 'database_cleaner/cucumber' 
    DatabaseCleaner[:active_record].strategy = :transaction 
rescue NameError 
    raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it." 
end 


Before do 
    DatabaseCleaner.start 
end 

After do |scenario| 
    DatabaseCleaner.clean 
end 

。私もthis postの3番目の部分に記載されているハックを試しましたが、何も何も働かなかった...

私は本当にこれを達成する方法を知っていないと大いに感謝します。

ありがとうございます。

答えて

22

クイック答え:

JavaScriptのではなく、トランザクションの切り捨てを使用するテストの設定:

DatabaseCleaner.strategy = :truncation 

長い説明:

取引戦略ではJavaScriptのテストでうまく動作しませんがこれは、ほとんどのJavaScript対応カピバラドライバがアプリケーションコードとは異なるスレッドでテストを実行するためです。

  • カピバラは、バックグラウンドスレッドでWEBrickにまたは薄いを使用して、ラックのアプリケーションを起動する:ここで

    は、プロセスの基本的なアウトラインです。

  • メインスレッドはドライバをセットアップし、ラックアプリケーションが実行されているポートを提供します。
  • あなたのテストでは、ドライバとアプリケーションとのやり取りが要求されます。これにより、偽のWebブラウザはアプリケーションに対して要求を実行します。

これは、メモリ内のRackアプリケーションに対して要求を実行する偽のブラウザを作成するのが難しいため、これが必要です。一部のデータベースドライバでは、同じトランザクションに対して複数のスレッドからクエリを実行することは安全ではありません。

この結果、アプリケーションコードにデータが表示されるように、テストコードでトランザクションをコミットする必要があります。これを修正する最も簡単な方法は、切り捨てデータベースクリーナー戦略を使用することです。

JavaScriptテストを除くすべてのトランザクションでRSpec(またはキュウリ)を使用するように設定できます。これは、JavaScriptテストのためにまだ働いている間に、非JavaScriptテストの方が速くなります。

Avdiグリムは詳細に解決策を説明し、このテーマに関する優れたブログ記事があります。http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

0

キュウリではトランザクションベースの開始が機能しません。この理由は、2つの別々のプロセスを実行している、1つはアプリケーションサーバーを実行していて、もう1つは実際の要求を実行していることです。これにはさまざまな方法がありますが、汚れたハックです。クリーンなソリューションは、DatabaseCleaner戦略のように切り捨てを使用することです。

DatabaseCleaner.strategy = :truncation 

Before do 
    DatabaseCleaner.clean_with :truncation 
end 
+2

それは、取引戦略がキュウリで動作しないと言うことは正しくないです。それはあなたが使っているカピバラのドライバーによって異なります。ラックテストでは、すべてがインプロセスであるため、トランザクション戦略が機能するはずです。 –

+0

あなたは正しいです。 @ javascriptが常に有効になっているので、私は古い良品のラックテストを完全に忘れていました。 – svyatogor

関連する問題