背景
実際にどんなSQL出てるのか見たい。
ローカルで単発想定。
belongs_toのvalidationでSQL呼ばれてるとかに気付くことができる。
出力方法
.rb
# before
# subject { described_class.start!(user_id: user.id) }
# after
subject do
user_id = user.id
using_sql_logger do
described_class.start!(user_id:)
end
end
こう書き換えるとSQLが出力されるようにした。
準備
spec/support/sql_logger.rb
# frozen_string_literal: true
module SqlLogger
def using_sql_logger
cached_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = Logger.new($stdout)
yield
ActiveRecord::Base.logger = cached_logger
end
end
spec/rails_helper.rb
...
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
...
RSpec.configure do |config|
...
config.include SqlLogger
end
課題
subjectをまるっとくくってしまうと、letの遅延評価で呼ばれるクエリも出力されてしまう。
それを回避するために事前にロードしておくようにしたりするのが手間
参考