Rails5 で DatabaseCleaner を使う
Ruby Ruby on Rails
Published: 2019-06-02

やったこと

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 で試したのですが、うまく行かなかったので諦めました。

参考