Spec-Zone.ru › Ruby on Rails 7.2

модуль ActiveRecord::Assertions::QueryAssertions

Общедоступные методы экземпляра

assert_no_queries(include_schema: false, &block) Показать исходный код
# File activerecord/lib/active_record/testing/query_assertions.rb, line 42
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 87
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, все запросы (включая связанные со схемой)

that match the matcher are counted.

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 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

Утверждает, что количество 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 59
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, все запросы (включая связанные со схемой)

that match the matcher are considered.

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