Rails 5.1の新しいシステム仕様について読んだことから、私の理解はRailsはデータベーストランザクションを内部で処理するようになりました。
From Rspec's blog : "[以前]テストとテスト中のコードはデータベーストランザクションを共有できないため、RSpecの組み込みメカニズムを使用してデータベースの変更をロールバックすることはできず、代わりにデータベースクリーナーのようなgemが必要です。システムテストでは、Railsチームはこれが事実でないことを確認するために大変な作業を行ったため、余分なgemを必要とせずにRSpecのメカニズムを安全に使用できます。 "
私の経験は異なります:
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がまだ必要ですか?誰かがこれに遭遇したか、関連情報を教えてくれますか?
DatabaseCleaner gemは必要ありません。必要な手順の簡単な概要を次に示します。
capybara-Selenium
gemおよびdatabase_cleaner
gemSelenium-webdriver
gemRails_helper
ファイル、設定config.use_transactional_fixtures = true
config.include Devise::Test::IntegrationHelpers, type: :system
basic_configure
このファイルは Noel Rappin によるファイルです。RSpec.feature
全体にRSpec.describe
。スイッチの管理方法の詳細については、 this commit を参照してください。面倒でしたが、5.1.5でActionDispatch :: SystemTesting :: Serverの問題が修正されたので(5.1.4でファイルにモンキーパッチを適用する必要がありましたが、今は必要ありません)簡単になりました。