RSpec実行中に行ったDBへの変更を残す
RSpecでDBに対してデータを追加・変更したりするコードを実行すると、確かにコードは動いているのに、実行が終わるとその追加・変更がDBに残っていない(実行した後にDBを見てみると、なぜか反映されていない)ということがありました。調べてみると原因は2つ。なお、Railsのバージョンは3.1.10。
- 参照しているDBの環境が異なる
普通にrails newでプロジェクトを作ると、デフォルトではdevelopment環境のDBを参照するようになっています。ただ、RSpecでコードを動かす際は、test環境のDBを参照するように切り替わるようです。
spec_helper.rbに
ENV["RAILS_ENV"] ||= 'test'
という箇所があるので、
ENV["RAILS_ENV"] ||= 'development'
と書き換えるとdevelopment環境を見るようになります。
- データの変更がコミットされない
RSpecで実行している間は1つのトランザクションで動いているらしく、しかもそのトランザクションが何もしないとコミットされないようです。
spec_helper.rbに
config.use_transactional_fixtures = true
という箇所があるので、これをコメントアウトするなりfalseに書き換えるなりすれば(そもそもトランザクションとして実行されないので)RSpec実行後にもデータが残るようになります。
あくまでもRSpecで記述されたことのみを内部で実行し、それの影響をローカルのdevelopment環境には残さないようにするための配慮なのでしょう。うまく考えられている…ので、上記のことをするのは本来の目的に反している気がします。