web-dev-qa-db-ja.com

DatabaseCleanerはRailsシステム仕様でまだ必要ですか?

Rails 5.1の新しいシステム仕様について読んだことから、私の理解はRailsはデータベーストランザクションを内部で処理するようになりました。

From Rspec's blog : "[以前]テストとテスト中のコードはデータベーストランザクションを共有できないため、RSpecの組み込みメカニズムを使用してデータベースの変更をロールバックすることはできず、代わりにデータベースクリーナーのようなgemが必要です。システムテストでは、Railsチームはこれが事実でないことを確認するために大変な作業を行ったため、余分なgemを必要とせずにRSpecのメカニズムを安全に使用できます。 "

私の経験は異なります:

  1. Rails 5.1。にアップグレードした後、私のRspec機能テストはすべて合格しました。
  2. 「機能」仕様の名前を「システム」仕様に変更しました。すべてのテストに合格しました。
  3. Database Cleaner gemを削除し、Rails_helper.rbからすべての参照を削除しました。 JSテストはvalidates uniquenessエラーが原因で失敗するようになりました。非JSテストに合格します。

私のテストは非常に簡単です。

let(:subject) { page }
let(:user) { create :user, name: "TestUser" }
it "displays the user page", :js do
  visit user_path(user)
  it is_expected.to have_content "TestUser"
end

データベースクリーナーを無効にして:js => trueを取得すると、user named TestUser already existsを取得します。 :js => falseでテストに合格します。

システムテストとrspecの現在の状況は何ですか? Railsデータベーストランザクションを内部で処理しますか、それともDatabase Cleanerがまだ必要ですか?誰かがこれに遭遇したか、関連情報を教えてくれますか?

19
Andy Harvey

DatabaseCleaner gemは必要ありません。必要な手順の簡単な概要を次に示します。

  1. 削除する capybara-Selenium gemおよびdatabase_cleaner gem
  2. 追加 Selenium-webdriver gem
  3. 必ずRails 5.1.5以降。Rails 5.1の以前のバージョンでは、問題を引き起こしたActionDispatch :: SystemTesting :: Serverに欠陥がありました(修正 ここ )。
  4. あなたのRails_helperファイル、設定config.use_transactional_fixtures = true
  5. Devise for authを使用している場合は、Rails_helperファイルでconfig.include Devise::Test::IntegrationHelpers, type: :system
  6. basic_configureこのファイルは Noel Rappin によるファイルです。
  7. 置換RSpec.feature全体にRSpec.describe

スイッチの管理方法の詳細については、 this commit を参照してください。面倒でしたが、5.1.5でActionDispatch :: SystemTesting :: Serverの問題が修正されたので(5.1.4でファイルにモンキーパッチを適用する必要がありましたが、今は必要ありません)簡単になりました。

21
moveson