MockMe is a tool used to mock dependencies / function calls when running unit (lib) tests in Rust.
Unfortunately, due to the non determinstic order of how tests are performed by rust/cargo, a mocked function can only be injected by a single test. If it is mocked by multiple tests, it may be subject to random panics due to race conditions. As a result, this is mainly just an experimental toy crate and it should not be used in production codebases.
Currently, only works on nightly.
Simply use the macro as seen in the example below.
When this code is run normally, MockMe will have no effect.
However, when the code is run as part of a unit test #[cfg(test)]
,
the mocked token will be used instead.
#![feature(proc_macro)]
extern crate mockme;
use mockme::{mock, inject};
// Below we will create two mocking identifiers called id_1 and id_2.
// We will then provide the name of the two functions we are mocking, as well as
// their type signature. In future iterations, hopefully the signature won't be needed.
#[mock(id_1="external_db_call: fn(u32) -> String", id_2="other_call: fn() -> String")]
fn my_super_cool_function() -> String {
let input = 42u32;
// external_db_call will be replaced with fake_mocked_call during testing
let db_result = external_db_call(input);
// other_call will also be replaced
let other_result = other_call();
format!("I have two results! {} and {}", db_result, other_result)
}
// Finally, when we run our tests, we simply need to provide the identifier we previously used,
// as well as the name of the replacement function
#[test]
#[inject(id_1="db_fake", id_2="other_fake")]
fn actual_test2() {
let result = my_super_cool_function();
assert_eq!(result, "I have two results! Faker! and This is indeed a disturbing universe.");
}
fn db_fake(_: u32) -> String { "Faker!".to_string() }
fn other_fake() -> String { "This is indeed a disturbing universe.".to_string() }
All contributions are welcome! This library is still in its infancy, so everything helps. Code contributions, feature requests and bug reports are all appreciated.
Currently, the library is unable to infer the signature of the function that is being mocked. As a result, the programmer needs to provide it, which hurts the ergonomics of the library.