#mocking #logger #thread-safe #parallel-testing #multiple #running #mock-logger

mt-mock-logger

A thread-safe mock logger for multiple tests running in parallel

2 releases

0.1.2 Sep 24, 2024
0.1.1 Sep 23, 2024
0.1.0 Sep 23, 2024

#340 in Testing

MIT license

7KB
106 lines

mt-mock-logger

A thread-safe mock logger designed to support mocking across multiple tests running in parallel.

The injected logger is automatically scoped to the lifetime of the returned MockLoggerGuard provided by the set_logger function.

The MockLogger is not intended for use with async. Since it binds the injected logger to the test's ThreadId, using it in an async context may result in unexpected behavior.

Usage

[dev-dependencies]
mt-mock-logger = "0.1"
#[cfg(test)]
mod tests {
    use mt_mock_logger::MockLogger;
    use mockall::mock;

    use super::*;

    mock! {
        pub MyLogger {}
        impl log::Log for MyLogger {
            fn enabled<'a>(&self, metadata: &log::Metadata<'a>) -> bool;
            fn log<'a>(&self, record: &log::Record<'a>);
            fn flush(&self);
        }
    }

    #[test]
    fn test_logging() {
        let mut my_logger = MockMyLogger::new();
        my_logger
            .expect_log()
            .withf(|r| r.level() == log::LevelFilter::Info && 
                        r.args().as_str() == Some("ok"))
            .once()
            .return_const(());

        let _guard = MockLogger::set_logger(my_logger, log::LevelFilter::Info);

        log::info!("ok");
        log::trace!("ok");
    }

    #[test]
    fn test_logging_below_max_level() {
        let mut my_logger = MockMyLogger::new();
        my_logger.expect_log().never().return_const(());

        let _guard = MockLogger::set_logger(my_logger, log::LevelFilter::Info);

        log::trace!("ok");
    }

    #[test]
    fn test_no_logger() {
        log::trace!("ok");
    }
}

Dependencies

~87KB