13 releases (8 breaking)

0.9.0 Jul 13, 2022
0.7.0 Jun 28, 2022
0.3.0 May 17, 2019
0.2.1 Sep 23, 2018
0.1.0 Mar 11, 2018

#313 in Testing

Download history 40/week @ 2024-06-16 42/week @ 2024-06-23 39/week @ 2024-06-30 44/week @ 2024-07-07 44/week @ 2024-07-14 48/week @ 2024-07-21 45/week @ 2024-07-28 17/week @ 2024-08-04 23/week @ 2024-08-11 28/week @ 2024-08-18 35/week @ 2024-08-25 24/week @ 2024-09-01 22/week @ 2024-09-08 10/week @ 2024-09-15 81/week @ 2024-09-22 33/week @ 2024-09-29

151 downloads per month
Used in 2 crates

MIT license

21KB
425 lines

mock-it


Current Crates.io Version

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.

Features

  • Intuitive usage 😌
  • Mock your traits 🦾
  • Configure your mocks 👷‍♀️
  • Separate configuration from assertion 🕵️‍♀️

Example

#[cfg_attr(test, mock_it::mock_it)]
trait Nurse {
    fn heal(&self, pokemon: Pokemon) -> Result<Pokemon, String>;
}

#[derive(Debug, PartialEq, Clone)]
pub struct Pokemon {
    hp: i32,
}

struct PokemonCenter {
    nurse: Box<dyn Nurse>,
    pokemons: Vec<Pokemon>,
}

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)
    }
}

#[cfg(test)]
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());
    }
}

Further use cases

Constraints

  • Trait inputs must implement both PartialEq and Clone
  • Trait ouput must implement Clone

Dependencies

~1.5MB
~36K SLoC