[Rspec]Deviseでメール認証をつけてる時のテストの書き方


・はじめに

僕はdeviseでメール認証を有効化しているのですが、System Specを書くときに少しはまったので、メモとして残しておきます。

・前程

・rspecとfactory_botは導入済み。
・System Specを実行できる環境が整っている。(chromeのインストール、capybaraの設定など。)

・手順

1.factory_botでデータを作成。


最後のafter(:create) {|user| user.confirm}がポイントです。これによって、system specのbeforeブロックなどでuser=create(:testuser)と書いたとき、自動でアカウントが有効化されます。

2.config/environments/test.rbを編集

config.action_mailer.delivery_method = :test  #これはデフォルトで書いてあるはず。
config.action_mailer.default_url_options = { :host => 'localhost:3000' }  #これを追加。

3.System Specを書いて実行。


今回はこんな感じでログインとログアウトだけのテストを書きました。(テストコードとして意味があるのかは疑問ですが...)
これを実行してみます。

無事、テストが通りました

番外編~Test環境のDBは毎回rollbackされる。~

ここからはdeiseのテストとは関係ないのですが、個人的に有益な情報だったので番外編として載せておきます。
僕がSystem Specを書いているときに疑問に思ったのは「Test環境のDBって毎回リセットされるの?」ということです。それについて調べてみました。
結論から言うと、Test環境のDBは毎回rollbackされます。

このconfig.use_transactional_fixtures = trueの部分でrollbackしているようです。
実際にログを見てみると...(先ほどのSystem Specを実行した直後)

最後に注目すると、logoutして、ホームページにリダイレクトされた後(テストが終了した後)にDBがroollbackされていることが分かります。
testを実行するたびにrollbackされるのは知らなかった...(まあ確かにrollbackされないと大変ですもんね。うまく出来てるもんだ。)
以上、今日の学びでした。

・参考

【Rails】factory_botの使い方メモ
https://qiita.com/at-946/items/aaff42e4a9c2e4dd58ed

使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」
https://qiita.com/jnchito/items/607f956263c38a5fec24

Testing (RSpec) with Devise's confirmable module
https://stackoverflow.com/questions/4433693/testing-rspec-with-devises-confirmable-module

RSpec with Railsでテスト時のデータはどのように削除されているか
https://www.mogulla3.tech/entry/2019/02/11/111415