読者です 読者をやめる 読者になる 読者になる

炊きたてのご飯が食べたい

定時に帰れるっていいね。自宅勤務できるっていいね。子どもと炊きたてのご飯が食べられる。アクトインディでは積極的にエンジニアを募集中です。

feature テストで作成されたデータはテスト完了後もDBに残る


spec_helper.rb で config.use_transactional_fixtures = true している場合、テスト中に明示的に commit をしないとデータは DB に保存されず、テスト完了後にロールバックされる。その為、テスト中に作成したデータは、他のテストに干渉することはほぼないが、 feature テストで作成したデータはテストが完了してもDBに残り続ける( feature specは transaction を commit するらしい)。他のテストに影響を及ぼす為、扱いに注意する。

今回の例では、以下のような状態でテストが失敗した。

  1. spec/features/user_spec.rb の feature テストで user を1件作成(テスト中に self.use_transactional_fixtures = false を指定)
  2. spec/controllers/user_controller_spec.rb テストで user を1件作成(この時点で user が 2件になる)
  3. spec/controllers/user_controller_spec.rb で user が1件であることを検証し、failed となる。

このようなケースは fixture で作成したデータを使い回している場合に起こる。FactoryGirl を上手く使ってテストの独立性を担保するのが良いと思う。

調べたけどよく分からなかった点

bin/test-queue コマンドで問題が起きたが rspec コマンドでのテスト実行では、再現しなかった。

参考にさせていただいたサイト

capybaraをwebkitやseleniumとかで動かす場合の注意点と解決策