Method: ActiveRecord::Assertions::QueryAssertions#assert_queries_count

Defined in:
activerecord/lib/active_record/testing/query_assertions.rb

#assert_queries_count(count = nil, include_schema: false, &block) ⇒ Object

Asserts that the number of SQL queries executed in the given block matches the expected count.

# Check for exact number of queries
assert_queries_count(1) { Post.first }

# Check for any number of queries
assert_queries_count { Post.first }

If the :include_schema option is provided, any queries (including schema related) are counted.

assert_queries_count(1, include_schema: true) { Post.columns }


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

def assert_queries_count(count = nil, include_schema: false, &block)
  ActiveRecord::Base.lease_connection.materialize_transactions

  counter = SQLCounter.new
  ActiveSupport::Notifications.subscribed(counter, "sql.active_record") do
    result = _assert_nothing_raised_or_warn("assert_queries_count", &block)
    queries = include_schema ? counter.log_all : counter.log
    if count
      assert_equal count, queries.size, "#{queries.size} instead of #{count} queries were executed. Queries: #{queries.join("\n\n")}"
    else
      assert_operator queries.size, :>=, 1, "1 or more queries expected, but none were executed.#{queries.empty? ? '' : "\nQueries:\n#{queries.join("\n")}"}"
    end
    result
  end
end