[RSpec3]テストデータはどこへ消えた

  • 29
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Rails内で作成したモジュールのテストでDBのサンプルデータが必要となり、
specファイル内で、テスト用のデータを投入する記述をしたんだけど、

require 'rails_helper'

include モジュール

describe 'モジュール' do
  describe '#メソッド' do
    context 'XXXXXXXXXXXXXX' do
      before do
        FactoryGirl.create(:sample_data)
      end
      it 'return 0' do
        expect(メソッド(1)).to be > 0 #引数には、sample_dataのidが入る
      end
    end
  end
end

(sample_datasのテーブルは0レコード。idはauto_increment.)

テストを試みると
・1回目のテスト:通る
・2回目以降のテスト:そんなレコード(id=1のレコード)はないっておこられる
・test dbのsample_datasにはレコードが1つも存在しない。

なぜだ・・・・と思ってためしに手動でsample_datasにレコード挿入するとなぜかidに1でない値が挿入される。

色々調査した結果rails_helper.rb内の設定が原因であることが分かった

...
 # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = yes 
...

これを

...
 # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = no
...

とすると、テストによってレコードが挿入されることが確認できた。

確認中だけど、下記ってことかな

・config.use_transactional_fixtures = yesの場合、テスト内データ操作がトランザクションの扱いになって、さらにコミット処理をしてあげないとデータはDBに保存されない。

・config.use_transactional_fixtures = no の場合、トランザクションははしらず、INSERTしたタイミングでレコードが保存される

・レコードが0なのに、手動INSERTでidが1以外になった理由は、auto_incrementでシーケンスの払い出しをしたにも関わらずコミットしなかったので、シーケンスが破棄され、テストの度にインクリメントした値が振り出されていた

基本的なことじゃーんだったらすいません。