Spec-Zone.ru › Ruby on Rails 8.1

module ActiveRecord::Assertions::QueryAssertions

Открытые методы экземпляра

assert_no_queries (include_schema: false, &block) Показать исходный код
# 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 }
assert_no_queries_match (match, include_schema: false, &block) Показать исходный код
# 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 }
assert_queries_count (count = nil, include_schema: false, &block) Показать исходный код
# 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 }
assert_queries_match (match, count: nil, include_schema: false, &block) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API