RailsでRSpecなどのテストコードを実行すると、テストコード内で生成されたデータは通常、データベースに保存されません。これは、テストコードと本番環境を分離し、テストデータが本番データに混入することを防ぐためです。
仕組み
RSpecなどのテストフレームワークは、テストコードを実行する前に、以下の2つの重要な処理を行います。
1. トランザクションの開始: テストコードの実行前に、データベースへのトランザクションを開始します。
2. トランザクションのロールバック: テストコードの実行後に、トランザクションをロールバックします。
トランザクションのロールバックにより、テストコード内で生成されたすべてのデータ変更はデータベースにコミットされず、本番環境に影響を与えることはありません。
例外
一部のテストシナリオでは、テストデータをデータベースに保存する必要がある場合があります。そのような場合は、以下の方法で実現できます。
save! メソッドを使用する: モデルオブジェクトを保存する際に save! メソッドを使用すると、トランザクションのロールバック前にコミットされます。
DatabaseCleaner gemを使用する: DatabaseCleaner gemは、テストコード実行前にデータベースの状態をスナップショットし、テスト終了後に元の状態に戻す機能を提供します。
テストデータと本番データの分離
テストデータと本番データを分離することは、テストの信頼性を高め、本番環境への影響を防ぐために重要です。RSpecなどのテストフレームワークが提供するトランザクション機能を活用することで、効率的にテストデータと本番データを分離することができます。