module ActiveRecord::Assertions::QueryAssertions
Открытые методы экземпляра
# File activerecord/lib/active_record/testing/query_assertions.rb, line 48 def assert_no_queries(include_schema: false, &block) assert_queries_count(0, include_schema: include_schema, &block) end
Проверяет, что в заданном блоке не выполняются SQL-запросы.
assert_no_queries { post.comments }
Если указан параметр :include_schema, учитываются любые запросы (в том числе связанные со схемой).
assert_no_queries(include_schema: true) { Post.columns }
# File activerecord/lib/active_record/testing/query_assertions.rb, line 93 def assert_no_queries_match(match, include_schema: false, &block) assert_queries_match(match, count: 0, include_schema: include_schema, &block) end
Проверяет, что в заданном блоке не выполняются SQL-запросы, соответствующие шаблону.
assert_no_queries_match(/SELECT/i) { post.comments }
Если указан параметр :include_schema, учитываются любые запросы, соответствующие сопоставителю (в том числе связанные со схемой).
assert_no_queries_match(/FROM pg_attribute/i, include_schema: true) { Post.columns }
# File activerecord/lib/active_record/testing/query_assertions.rb, line 24
def assert_queries_count(count = nil, include_schema: false, &block)
ActiveRecord::Base.lease_connection.materialize_transactions unless include_schema
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 Проверяет, что количество SQL-запросов, выполненных в заданном блоке, совпадает с ожидаемым.
# Check for exact number of queries
assert_queries_count(1) { Post.first }
# Check for any number of queries
assert_queries_count { Post.first }
Все не материализованные транзакции будут материализованы, чтобы учитывались только запросы, выполняемые внутри блока.
Если указан параметр :include_schema, учитываются любые запросы (в том числе связанные со схемой). При включении этого параметра также пропускается аренда подключения для материализации ожидающих транзакций, поскольку необходимо учитывать запросы, выполняемые при открытии подключения (например, карту типов).
assert_queries_count(1, include_schema: true) { Post.columns }
# File activerecord/lib/active_record/testing/query_assertions.rb, line 65
def assert_queries_match(match, 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_match", &block)
queries = include_schema ? counter.log_all : counter.log
matched_queries = queries.select { |query| match === query }
if count
assert_equal count, matched_queries.size, "#{matched_queries.size} instead of #{count} queries were executed.#{queries.empty? ? '' : "\nQueries:\n#{queries.join("\n")}"}"
else
assert_operator matched_queries.size, :>=, 1, "1 or more queries expected, but none were executed.#{queries.empty? ? '' : "\nQueries:\n#{queries.join("\n")}"}"
end
result
end
end Проверяет, что SQL-запросы, выполненные в заданном блоке, соответствуют ожидаемому шаблону.
# Check for exact number of queries
assert_queries_match(/LIMIT \?/, count: 1) { Post.first }
# Check for any number of queries
assert_queries_match(/LIMIT \?/) { Post.first }
Если указан параметр :include_schema, учитываются любые запросы, соответствующие сопоставителю (в том числе связанные со схемой).
assert_queries_match(/FROM pg_attribute/i, include_schema: true) { Post.columns }
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.