提供用于断言 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
来源: 显示 | 在 GitHub 上
# 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
来源: 显示 | 在 GitHub 上
# 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
来源: 显示 | 在 GitHub 上
# 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
来源: 显示 | 在 GitHub 上
# 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