Module: SemanticLogger::Test::RSpec
- Defined in:
- lib/semantic_logger/test/rspec.rb
Overview
RSpec matchers and helpers for asserting on Semantic Logger events.
These mirror the Minitest helpers in SemanticLogger::Test::Minitest.
Enable them once, in spec_helper.rb:
require "semantic_logger/test/rspec"
RSpec.configure do |config|
config.include SemanticLogger::Test::RSpec
end
Capture the events emitted whilst running a block, then assert on them:
events = capture_semantic_logger_events { User.new.enable! }
expect(events.first).to be_a_semantic_logger_event(level: :info, message: "User enabled")
Or assert directly that a block logs a matching event:
expect { User.new.enable! }.to(
log_semantic_logger_event(level: :info, message: "User enabled")
)
Defined Under Namespace
Classes: EventMatcher, LogEventMatcher
Constant Summary collapse
- EVENT_ATTRIBUTES =
Attributes that may be asserted on a single log event. The keys map directly onto SemanticLogger::Log attributes, except for the *_includes variants which assert a partial (substring / subset) match.
%i[ level name message thread_name tags named_tags context metric metric_amount dimensions level_index duration time exception backtrace payload ].freeze
Instance Method Summary collapse
-
#a_semantic_logger_event(**expected) ⇒ Object
Composable alias, for use inside other matchers:.
-
#be_a_semantic_logger_event(**expected) ⇒ Object
Matcher for a single captured log event.
-
#capture_semantic_logger_events(klass = nil, silence: :trace, &block) ⇒ Object
Returns [ArraySemanticLogger::Log] the log events captured whilst running the supplied block.
-
#log_semantic_logger_event(on: nil, **expected) ⇒ Object
Block matcher asserting that the block logs a matching event.
Instance Method Details
#a_semantic_logger_event(**expected) ⇒ Object
Composable alias, for use inside other matchers:
expect(events).to include(a_semantic_logger_event(message: "Hi"))
224 225 226 |
# File 'lib/semantic_logger/test/rspec.rb', line 224 def a_semantic_logger_event(**expected) EventMatcher.new(**expected) end |
#be_a_semantic_logger_event(**expected) ⇒ Object
Matcher for a single captured log event.
expect(events.first).to be_a_semantic_logger_event(level: :info, message: "Hi")
217 218 219 |
# File 'lib/semantic_logger/test/rspec.rb', line 217 def be_a_semantic_logger_event(**expected) EventMatcher.new(**expected) end |
#capture_semantic_logger_events(klass = nil, silence: :trace, &block) ⇒ Object
Returns [ArraySemanticLogger::Log] the log events captured whilst running the supplied block.
Notes:
- All log events are captured regardless of the global default log level.
- Pass a class to capture only events logged through that class's logger. Otherwise every log event in the process is captured for the duration of the block.
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/semantic_logger/test/rspec.rb', line 197 def capture_semantic_logger_events(klass = nil, silence: :trace, &block) logger = SemanticLogger::Test::CaptureLogEvents.new if klass allow(klass).to receive(:logger).and_return(logger) block.call elsif silence SemanticLogger.silence(silence) do stub_processor(logger, &block) end else stub_processor(logger, &block) end logger.events end |
#log_semantic_logger_event(on: nil, **expected) ⇒ Object
Block matcher asserting that the block logs a matching event.
expect { User.new.enable! }.to(
log_semantic_logger_event(level: :info, message: "User enabled")
)
Pass on: to capture only one class's events.
235 236 237 |
# File 'lib/semantic_logger/test/rspec.rb', line 235 def log_semantic_logger_event(on: nil, **expected) LogEventMatcher.new(method(:capture_semantic_logger_events), on: on, expected: expected) end |