新たにSystem Specを導入しようとした時のお話です。
事象
ログイン処理を実装した時にログインができませんでした。
条件
・ローカルの画面上ではログインできる
・Factoryのデータ作成もできている
・他のSpecにて、Factoryを使用したデータではログインできる = Factoryで作成するデータ構造は正しい
・Feature Specでは成功した = System Specの記述もおかしくなさそう
結論
Database Cleanerを導入していてFactoryで作成したデータが消えたためログインできなかったようです。
解決方法
Database Cleanerの記述自体を消した時に他のSpecの挙動がおかしくなったから次の書き方で対応しました。
・ use_truncation: false
を適用させてDatabase Cleanerを無効
参照
https://qiita.com/takeyuweb/items/e7261e9274b3b31d933c
RSpec.describe 'XXXX', type: :system do
# ここにはDatabase Cleanerを適用させない
context "Login", use_truncation: false do
it 'is login test' do
expect(page).to have_content 'ログインしました'
end
end
end
RSpec.configure do |config|
.
.
config.use_transactional_fixtures = true
.
.
end
Database Cleanerについて
テスト毎にデータベースを空(truncate)にする機能。
Database Cleanerの設定記述を消してSpec実行してみると
テストテーブルにデータが残っていることを確認できます。
伊藤さんのブログ(Database Cleaner)より抜粋します。
Rails 5.1ではDatabase Cleanerはもう必要ありません。
基本的にはDatabase Cleaner自体導入しなくても良さそうです。
途中からSystem Specを導入しようとしたら同じような事象が発生するかもしれませんね。
今まで特にDatabase Cleanerを意識したことがないので良い経験になりました。
他の皆さんはこのような事象に遭遇したことありますか?
もし、経験された方がいましたらどのような対応されたか教えていただけると嬉しいです。
追記
System Specでは データベースが自動的にロールバックされる みたいです。
(データベースの自動ロールバック)
https://techracho.bpsinc.jp/hachi8833/2018_01_25/51101
だからFeatureSpecでは同じ記述でもログインできました。