feature テストで作成されたデータはテスト完了後もDBに残る
spec_helper.rb で config.use_transactional_fixtures = true している場合、テスト中に明示的に commit をしないとデータは DB に保存されず、テスト完了後にロールバックされる。その為、テスト中に作成したデータは、他のテストに干渉することはほぼないが、 feature テストで作成したデータはテストが完了してもDBに残り続ける( feature specは transaction を commit するらしい)。他のテストに影響を及ぼす為、扱いに注意する。
今回の例では、以下のような状態でテストが失敗した。
- spec/features/user_spec.rb の feature テストで user を1件作成(テスト中に self.use_transactional_fixtures = false を指定)
- spec/controllers/user_controller_spec.rb テストで user を1件作成(この時点で user が 2件になる)
- spec/controllers/user_controller_spec.rb で user が1件であることを検証し、failed となる。
このようなケースは fixture で作成したデータを使い回している場合に起こる。FactoryGirl を上手く使ってテストの独立性を担保するのが良いと思う。
調べたけどよく分からなかった点
bin/test-queue コマンドで問題が起きたが rspec コマンドでのテスト実行では、再現しなかった。