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でシーケンスの払い出しをしたにも関わらずコミットしなかったので、シーケンスが破棄され、テストの度にインクリメントした値が振り出されていた
基本的なことじゃーんだったらすいません。