2017-12-18 7 views
0

rails 4.1 RSPECとCapybaraでテストを行っている私には、私はテストを実行するために使用する、私はbdに格納されているいくつかのデータを生成するテストを実行している、または私が必要なものは、テストを実行した後、これらのデータはそこに格納されません。RSPECとCapybaraでテストを実行して生成されたデータのみを集めたデータ

私はgem database_cleaner(RSPECとCapybaraでテストを実行して生成されたデータのみのクリーンテストデータベース)を使用しましたが、これによってテストbdのすべてのデータがクリアされます。テスト。

私はこの構成を持っており、テストはjavascrpitテストです:

config.use_transactional_fixtures = false 
    config.before(:suite) do 
     if config.use_transactional_fixtures? 
      raise(<<-MSG) 
      Delete line `config.use_transactional_fixtures = true` from rails_helper.rb 
      (or set it to false) to prevent uncommitted transactions being used in 
      JavaScript-dependent specs. 

      During testing, the app-under-test that the browser driver connects to 
     uses a different database connection to the database connection used by 
      the spec. The app's database connection would not be able to access 
      uncommitted transaction data setup over the spec's database connection. 
      MSG 
     end 
    DatabaseCleaner.clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
end 

    config.before(:each, type: :feature) do 
     driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test 

     if !driver_shares_db_connection_with_specs 
      DatabaseCleaner.strategy = :truncation 
    end 
end 
+1

実行するテストごとにデータベースをクリーンな状態にしたくない理由を理解するのは難しい - – David

答えて

0

あなたが欲しいデータを含むテーブル内のレコードを作成している場合は、この

rake db:reset RAILS_ENV=test 
+0

これは、テストのbdをリセットします。必要なのは、他のテストケースが影響を受けないようにbdにデータが保存されていないということです同じ実行からです – Andres23Ramirez

+0

[database_cleaner](https://github.com/Dat)を試してみてください –

+0

)[:truncation](https://github.com/DatabaseCleaner/database_cleaner#what-strategy-is-fastest)オプション –

1

を使用することができますあなたのテストに保存されていれば、あなたが望むことをするための簡単な設定変更(database_cleanerの簡単な設定変更など)はありません。これは、それがrails 4.1のCapybaraとJSテストと互換性がないdatabase_cleanerのトランザクションモードであるためです(Rails 5.1トランザクションモードでは互換性があり、ほとんどの設定でdatabase_cleanerは必要なくなりました)

テストから保存したいテーブルのレコードを作成/削除/更新すると、database_cleanerにそのテーブルをスキップするよう指示できます。

あなたがしたいことをするのは簡単ではないので、他の人のほとんどが何かをしようとしている理由を正確に尋ね、自分のやり方を調整する必要があります。

あなたがやろうとしていることをやり直したい場合(テストで既存のデータを変更していない(新しい行を追加するだけの場合)、前のフックを作成する必要があります各テーブルに最大IDを格納し、IDの大きいレコードを削除し、database_cleanerを使用しないアフターフック

+0

あなたの答えをありがとう、それは非常に有用です あなたは私が欲しいものをする正しい方法ではないことを教えてください、それを行う正しい方法は何ですか? – Andres23Ramirez

+0

@ Andres23Ramirez通常、機能テストは、テストの開始時に特定のテストに必要なレコードだけを設定することによって行われます。そうすれば、各テストは他のテストと完全に分離されます。あなたはそれをやっていない本当に良い理由があるかもしれませんが、正確にすべてのテストの前にあなたのテストDBにあらかじめデータをあらかじめ入れておきたい理由や事例はたくさんありません。 –

関連する問題