LoginSignup
44

More than 5 years have passed since last update.

posted at

updated at

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

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でシーケンスの払い出しをしたにも関わらずコミットしなかったので、シーケンスが破棄され、テストの度にインクリメントした値が振り出されていた

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
44