やったこと
Rails5 の Rspec で、DatabaseCleaner を導入してみます。
テスト用のデータベースとして MySQL を利用しているのですが、ロールバックしても auto_increment のカラムは数字が増え続けてしまうので、その対応をするため、DatabaseCleaner を使ってみます。
確認環境
$ ruby --version
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
$ gem list | grep rspec-rails
rspec-rails (3.8.2)
調査
Gemfile に記載
Gemfile
group :development, :test do
...
gem 'database_cleaner'
end
$ bundle install
設定
spec/rails_helper.rb
require 'database_cleaner'
RSpec.configure do |config|
...
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
rspec で実行する (例)
spec/models/task_spec.rb
require 'rails_helper'
RSpec.describe Task, type: :model do
context 'validate task' do
scenario 'is valid with task' do
user = create(:user)
p user.id
task = build(
:task,
user_id: user.id
)
expect(task).to be_valid
end
end
end
下記テストを何回実行しても id が 1 であることを確認できます。
$ bundle exec rspec spec/models/task_spec.rb -fd
Task
validate task
1
is valid with task
Finished in 0.18589 seconds (files took 1.26 seconds to load)
1 example, 0 failures
test.log を見てみる
$ less -qR log/test.log
...
(0.8ms) SET FOREIGN_KEY_CHECKS = 0
(1.5ms) select table_name from information_schema.views where table_schema = 'xxxx_test'
(18.6ms) TRUNCATE TABLE `ar_internal_metadata`;
(26.6ms) TRUNCATE TABLE `tasks`;
(13.0ms) TRUNCATE TABLE `users`;
(0.8ms) SET FOREIGN_KEY_CHECKS = 1
truncate コマンドが実行されていることが確認できます。
※ 最初、DatabaseRewinder で試したのですが、うまく行かなかったので諦めました。