Module: AndOne::MinitestHelper

Defined in:
lib/and_one/matchers.rb

Overview

Minitest assertions for N+1 detection.

class MyTest < ActiveSupport::TestCase
include AndOne::MinitestHelper

test "no N+1 queries" do
  assert_no_n_plus_one do
    Post.includes(:comments).each { |p| p.comments.to_a }
  end
end
end

Instance Method Summary collapse

Instance Method Details

#assert_n_plus_one(message = nil) ⇒ Object

Assert that the block DOES trigger N+1 queries (useful for documenting known issues).



35
36
37
38
39
40
41
42
43
44
# File 'lib/and_one/matchers.rb', line 35

def assert_n_plus_one(message = nil, &)
  detections = scan_for_n_plus_ones(&)

  if detections.empty?
    msg = message || "Expected N+1 queries, but none were detected"
    flunk(msg)
  end

  detections
end

#assert_no_n_plus_one(message = nil) ⇒ Object

Assert that the block does NOT trigger any N+1 queries.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/and_one/matchers.rb', line 18

def assert_no_n_plus_one(message = nil, &)
  detections = scan_for_n_plus_ones(&)

  return unless detections.any?

  formatter = Formatter.new(
    backtrace_cleaner: AndOne.backtrace_cleaner || AndOne.send(:default_backtrace_cleaner)
  )
  detail = formatter.format(detections)
  summary = detections.map do |d|
    "#{d.count} queries to `#{d.table_name || "unknown"}` (expected 1)"
  end.join("; ")
  msg = message || "Expected no N+1 queries, but #{detections.size} detected: #{summary}\n#{detail}"
  flunk(msg)
end