跳至内容 跳至搜索

提供用于断言 ActiveSupport::EventReporter 事件的测试助手。

方法
A
W

实例公共方法

assert_event_reported(name, payload: nil, tags: {}, &block)

断言给定的块会导致一个名为 Rails.event 的事件被报告。

如果已执行的块代码报告了匹配的事件,则测试通过。

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

要进一步测试已报告事件的详细信息,您可以指定 payload 和 tag 匹配器。

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

assert_events_reported(expected_events, &block)

断言提供的事件已被报告,无论顺序如何。

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 相同的 payload 和 tag 匹配。

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 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_no_event_reported(name = nil, payload: {}, tags: {}, &block)

断言给定的块不会导致一个事件被报告到 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 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

with_debug_event_reporting(&block)

允许在给定块的持续时间内向 Rails.event 报告调试事件。

with_debug_event_reporting do
  service_that_reports_debug_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