модуль ActiveSupport::Testing::EventReporterAssertions
Предоставляет вспомогательные методы для тестирования событий ActiveSupport::EventReporter.
Публичные методы экземпляра
# 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
# 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
# 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
# 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.