発生した現象
RSpecでテスト実行後、普通はデータベースはリセットされてPKが1から採番されると思いますが、
何故かリセットされずテスト実行の度にPKがインクリメントしていくという現象が起きていました。
[例]
- 1回目のテストを実行し、Userのテストデータを5人分作成したらusersテーブルのidが1〜5まで生成される。
- 1回目を終え、2回目のテストを実行するとusersテーブルのidが6〜10が生成される。レコード自体は残っていない。
といった感じです。
別にバグやエラーというわけではないですが、気持ち悪かったので解消しようと思い
一応解決したので備忘録として残します。
環境
- Ruby 3.2.2
- Ruby on Rails 7.1.1
- PostgreSQL 15.3
docker composeで環境構築しています。
原因
結論、特定はできませんでした。
(わかる方いらっしゃればコメントいただけますと幸いです)
調べていてよく出てきたのは
「rails_helper.rbのconfig.use_transactional_fixtures
がfalseになっているとデータベースがロールバックされないよ〜」
とかでしたが、データは消えているので違いそうでした。。
解決策
テーブルに対してreset_pk_sequence!
を使えば、
見事テスト実行の度にシーケンスの自動採番が1から生成されるようになりました。
before(:suite)
を指定することで、テストスイート実行の前に毎回実行されます。
ちなみにreset_pk_sequence!
はDBがPostgreSQLの時だけ使えるようです。
spec/rails_helper.rb
RSpec.configure do |config|
###
config.before(:suite) do
ActiveRecord::Base.connection.tables.each do |table_name|
ActiveRecord::Base.connection.reset_pk_sequence!(table_name)
end
end
###
end
参考記事
以下の記事で解決しました。
感謝です!!