Mock it, don't mock all 🙃
Our goal is to enhance the DX behind mocking your depedencies when you test.
It lets you use a syntax closer to given
when
then
instead of having to
assert your then
BEFORE you call your function.
``` rust
trait Nurse {
fn heal(&self, pokemon: Pokemon) -> Result
pub struct Pokemon { hp: i32, }
struct PokemonCenter {
nurse: Box
impl PokemonCenter { pub fn accept(&mut self, pokemon: Pokemon) { self.pokemons.push(pokemon); }
pub fn collect(&mut self) -> Result<Pokemon, String> {
let pokemon = match self.pokemons.pop() {
Some(val) => val,
None => return Err("No pokemon".to_string()),
};
self.nurse.heal(pokemon)
}
}
mod tests { use super::*; use mock_it::{any, eq};
#[test]
fn can_heal_pokemon() {
// given
let pikachu_no_hp = Pokemon { hp: 0 };
let pikachu_full_hp = Pokemon { hp: 100 };
let nurse_joy = NurseMock::new();
nurse_joy.when_heal(eq(pikachu_no_hp.clone()))
.will_return(Ok(pikachu_full_hp.clone()));
let mut pokemon_center = PokemonCenter {
nurse: Box::new(nurse_joy.clone()),
pokemons: vec![],
};
// when
pokemon_center.accept(pikachu_no_hp);
let healed_pikachu = pokemon_center.collect().unwrap();
//then
assert_eq!(healed_pikachu, pikachu_full_hp);
assert!(nurse_joy.expect_heal(any()).times(1).called());
}
} ```