ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

rspecを使いながらN+1問題を検知する

タイトルの通りです。

ブラウザ上で動作確認を行う際には、Rails Panelを使えば、データベースクエリを簡単に目視できますが、rspecでテストを書いているときにクエリを全て出力させると他のテスト結果とごっちゃになって目視は至難です。

そこで便利なのがBulletで、N+1問題が生じている箇所を検知してくれるライブラリです。
使用するには以下のように設定ファイルを編集します。

# environments/test.rb
# configブロック内に追記
config.after_initialize do
  Bullet.enable = true
  Bullet.bullet_logger = true
  Bullet.raise = true # raise an error if n+1 query occurs
end

# spec/spec_helper.rb
# configブロック内に追記
config.before(:each) do
  Bullet.start_request if Bullet.enable?
end

config.after(:each) do
  Bullet.perform_out_of_channel_notifications if Bullet.enable? && Bullet.notification?
  Bullet.end_request if Bullet.enable?
end

これでN+1問題をログに出力するだけでなく、テストに失敗を記録してくれます。