みやちゃ
皆さんこんにちは、みやちゃです!
こちらでRailsアプリケーションでのRspecのテストの書き方を詳しく解説しています!
みなさんは、Rspecでテストを書いたことがありますか?
テストでは、擬似的にモデルを作成したり、パラメータの移動を確認したりします。
では、テストで作成されたデータベースはどうなるのでしょうか?
- Rspecのテストを実行した時のデータベースはどうなるのか?
Rspecで作成するデータベースについて理解することができます。
目次
テストで作成されたデータベースの行方
結論から言うと、exampleのたびに、データベースは削除されています。
spec/rails_helper.rbを開いてみてください。
以下のような記述が確認できると思います。
RSpec.configure do |config|
...
config.use_transactional_fixtures = true
...
end
上記のように、「config.use_transactional_fixtures」がtrueに設定されていると、exampleのたびにデータベースが削除されることになります。
transactionの中で、exampleのテストが行われ、テストが終わると、transactionがrollbackされる仕組みになっています。
log/test.logファイルを開いて見てみるとよくわかると思います。
[1m[35m (0.0ms)[0m [1m[36mbegin transaction[0m
[1m[35m (0.1ms)[0m [1m[31mrollback transaction[0m
上記のように、exampleの始めで、begin transactionとなり、exampleが終わると、rollback transactionとなっているのがよくわかります。
このように、テストは、exampleごとに、transactionの中で行われ、exampleが終わるたびに、transactionがrollbackされて、データが削除されているのです。
逆に、
RSpec.configure do |config|
...
config.use_transactional_fixtures = false
...
end
上記のように、「config.use_transactional_fixtures」をfalseの設定に変えると、データベースがテストが終わっても削除されなくなり、データベース上に残ることになります。
そのため、DatebaseCleanerなどで、データベースを綺麗にする必要があります。
データベースが残り続けるので、他のテストファイルでもデータを継続してテストをすることができるという利点はありますが、基本的には、設定はtrueにしておいて、テストが終わればデータベースを削除するというのがいいと思います。
before(:all)の注意
テストを書くときに、beforeを使うことがあるかと思いますが、beforeにはいくつか種類があります。
before(:all)を使ってしまうと、transactionの外側でデータベースが保存されてしまうため、exampleが終了しても、データベースが削除されずに残ってしまいます。
なのでbefore(:all)を使う際は、事後処理として削除するための記述をする必要があります。
まとめ
いかがでしたでしょうか?
今回は、テストで作成されたデータベースの行方について解説しました!
みやちゃ
ここまでご覧いただきありがとうございます!
こちら のUdemyの動画教材は、8時間で、
- Dockerで仮想環境構築
- Railsの基礎を解説しながら、アプリケーション開発
- RSpecでテストを記述
まで解説しています。
Udemyの教材へRailsエンジニアとして働くために必要な、DockerとRSpecを同時に解説してくれています。
DockerとRSpecを使って作ったポートフォリオはかなり評価が高くなります。
ぜひ動画を見てみてはいかがでしょうか?
Udemyの教材へ受講生は、5000人以上!です。
さらに、Udemyは、30日間の返金保証付きなので、いつでも返金できます。