database_cleanerがactive_record以外にもいろんなO/Rマッパーに対応してくれていて、かつどのO/Rマッパーを使っているのかを自動で判定してくれていたので使ってみた。
手順を進めていく上で所々つまづいたので、その時の対応方法をメモ。
# spec/spec_helper.rb
(省略)
require 'sequel' # database_cleanerがsequelを判定するために記述
require 'database_cleaner'
(省略)
RSpec.configure do |config|
(省略)
config.before(:suite) do
# 開始前にDBを初期化する
option = configure_of_db_connection # DB接続のコネクション情報
# TRUNCATEするのに外部キーが邪魔なので一時的に外部キーチェックをOFFにする
connection = Sequel.connect(option)
connection.execute('SET FOREIGN_KEY_CHECKS = 0;')
DatabaseCleaner[:sequel, { connection: connection }] # これをやっておかないとdatabase_cleanerがDB接続できない
DatabaseCleaner.clean_with(:truncation)
connection.execute('SET FOREIGN_KEY_CHECKS = 1;')
# 各テストはtruncateで対応
DatabaseCleaner.strategy = :truncation
end
(省略)
# 各テストケースごとにトランザクション開始
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
ハマったポイントと対応内容は下記。
- オートローダー等を使用していなかったので
DatabaseCleaner
がSequel
を探せなくてDB接続ができなかったので、requireでsequelを呼び出す処理を追記。 - 当たり前だけども
DatabaseCleaner
がDBに接続できないと初期化等が出来ないのでSequel
でのDB接続設定を渡してあげる。
ついでにハマった現象として、外部キーを指定している時にTRUNCATEしようとするとエラーが発生するので、
それを回避させるためにclean_withの前後で外部キーを無視する記述を追加した。
※意外と検索しても出てこなくて、外部キーを使っている人が少ないのかな?と思ったり
直接の解決ではなかったけども、
Rspec with database_cleaner on Sequel causes foreign key truncation error
が参考になった。
上記で解決できなかった問題として、
- DatabaseCleanerの各テストでのデータのものたせ方を
truncation
からtransaction
に変更したい
がある。
対応したかったんだけども、最初にconnectionを渡してしまっていたのと、実処理のところでsequelを変な呼び方していて、呼び出すたびにconnectionを生成しているっぽくてtransactionが効かなかったので断念。