Spec-Zone.ru › Ruby on Rails 8.1

модуль ActiveSupport::Testing::EventReporterAssertions

Предоставляет вспомогательные методы для тестирования событий ActiveSupport::EventReporter.

Публичные методы экземпляра

assert_event_reported (name, payload: nil, tags: {}, &block) Показать исходный код
# File activesupport/lib/active_support/testing/event_reporter_assertions.rb, line 142
def assert_event_reported(name, payload: nil, tags: {}, &block)
  events = EventCollector.record(&block)

  if events.empty?
    flunk("Expected an event to be reported, but there were no events reported.")
  elsif (event = events.find { |event| event.matches?(name, payload, tags) })
    assert(true)
    event.event_data
  else
    message = "Expected an event to be reported matching:\n  " \
      "name: #{name.inspect}\n  " \
      "payload: #{payload.inspect}\n  " \
      "tags: #{tags.inspect}\n" \
      "but none of the #{events.size} reported events matched:\n  " \
      "#{events.map(&:inspect).join("\n  ")}"
    flunk(message)
  end
end

Проверяет, что блок приводит к отправке события с заданным именем в Rails.event.

Проверка проходит, если выполненный код в переданном блоке отправляет соответствующее событие.

assert_event_reported("user.created") do
  Rails.event.notify("user.created", { id: 123 })
end

Чтобы проверить дополнительные сведения об отправленном событии, можно указать сопоставители полезной нагрузки и тегов.

assert_event_reported("user.created",
  payload: { id: 123, name: "John Doe" },
  tags: { request_id: /[0-9]+/ }
) do
  Rails.event.tagged(request_id: "123") do
    Rails.event.notify("user.created", { id: 123, name: "John Doe" })
  end
end

Сопоставители поддерживают частичное сопоставление — должны совпадать только указанные ключи.

assert_event_reported("user.created", payload: { id: 123 }) do
  Rails.event.notify("user.created", { id: 123, name: "John Doe" })
end
assert_events_reported (expected_events, &block) Показать исходный код
# File activesupport/lib/active_support/testing/event_reporter_assertions.rb, line 184
def assert_events_reported(expected_events, &block)
  events = EventCollector.record(&block)

  if events.empty? && expected_events.size > 0
    flunk("Expected #{expected_events.size} events to be reported, but there were no events reported.")
  end

  events_copy = events.dup

  expected_events.each do |expected_event|
    name = expected_event[:name]
    payload = expected_event[:payload] || {}
    tags = expected_event[:tags] || {}

    matching_event_index = events_copy.find_index { |event| event.matches?(name, payload, tags) }

    if matching_event_index
      events_copy.delete_at(matching_event_index)
    else
      message = "Expected an event to be reported matching:\n  " \
        "name: #{name.inspect}\n  " \
        "payload: #{payload.inspect}\n  " \
        "tags: #{tags.inspect}\n" \
        "but none of the #{events.size} reported events matched:\n  " \
        "#{events.map(&:inspect).join("\n  ")}"
      flunk(message)
    end
  end

  assert(true)
end

Проверяет, что указанные события были отправлены, независимо от их порядка.

assert_events_reported([
  { name: "user.created", payload: { id: 123 } },
  { name: "email.sent", payload: { to: "user@example.com" } }
]) do
  create_user_and_send_welcome_email
end

Поддерживает такое же сопоставление полезной нагрузки и тегов, как assert_event_reported.

assert_events_reported([
  {
    name: "process.started",
    payload: { id: 123 },
    tags: { request_id: /[0-9]+/ }
  },
  { name: "process.completed" }
]) do
  Rails.event.tagged(request_id: "456") do
    start_and_complete_process(123)
  end
end
assert_no_event_reported (name = nil, payload: {}, tags: {}, &block) Показать исходный код
# File activesupport/lib/active_support/testing/event_reporter_assertions.rb, line 101
def assert_no_event_reported(name = nil, payload: {}, tags: {}, &block)
  events = EventCollector.record(&block)

  if name.nil?
    assert_predicate(events, :empty?)
  else
    matching_event = events.find { |event| event.matches?(name, payload, tags) }
    if matching_event
      message = "Expected no '#{name}' event to be reported, but found:\n  " \
        "#{matching_event.inspect}"
      flunk(message)
    end
    assert(true)
  end
end

Проверяет, что блок не приводит к отправке события в Rails.event.

Если имя не указано, проверка проходит, если выполненный код в переданном блоке не отправляет события.

assert_no_event_reported do
  service_that_does_not_report_events.perform
end

Если имя указано, проверка проходит, если выполненный код в переданном блоке не отправляет события с этим именем.

assert_no_event_reported("user.created") do
  service_that_does_not_report_events.perform
end
with_debug_event_reporting (&block) Показать исходный код
# File activesupport/lib/active_support/testing/event_reporter_assertions.rb, line 222
def with_debug_event_reporting(&block)
  ActiveSupport.event_reporter.with_debug(&block)
end

Разрешает отправку событий отладки в Rails.event на время выполнения заданного блока.

with_debug_event_reporting do
  service_that_reports_debug_events.perform
end

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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