LoginSignup
1
1

More than 5 years have passed since last update.

Sinatra + Sequel + RSpec + DatabaseCleanerでテスト自動化の環境を構築する上でハマったメモ

Last updated at Posted at 2017-05-28

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

ハマったポイントと対応内容は下記。

  • オートローダー等を使用していなかったのでDatabaseCleanerSequelを探せなくて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が効かなかったので断念。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1