DatabaseCleaner.strategy = :transaction
でレコードを削除していると、ROLLBACKとSAVEPOINTを使ってレコードの作成、削除を行う。
その際に作成されるレコードはindexが作成されないため、FULLTEXT searchでの検索に引っかからないなどによってテストが通らない。
そのため、DatabaseCleaner.strategy = :truncation
に設定する必要があるのだが、:truncationを使うと実際にレコードを登録してしまうため
:trusaction`に比べると実行時間が長くなってしまう。
そこで、必要な箇所だけmetadata
で経由で:truncation
と:transaction
を制御するようにしました。
metadataでDatabaseCleaner.strategyを切り替える
spec_helper.rb
RSpec.configure do |config|
## 各種設定
config.use_transactional_fixtures = false
config.before(:each) do |example|
DatabaseCleaner.strategy = example.metadata[:cleaner] || :transaction
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
あとはテスト側で、下記のようにcleaner
の種類を指定することで一部分のみ:trucation
に設定することができます。
describe 'search hoge', cleaner: :truncation do
end