13 个版本 (8 个破坏性版本)

0.9.0 2022年7月13日
0.7.0 2022年6月28日
0.3.0 2019年5月17日
0.2.1 2018年9月23日
0.1.0 2018年3月11日

#224 in 测试

Download history 6/week @ 2024-04-08 8/week @ 2024-04-22 6/week @ 2024-05-13 36/week @ 2024-05-20 23/week @ 2024-05-27 31/week @ 2024-06-03 38/week @ 2024-06-10 39/week @ 2024-06-17 42/week @ 2024-06-24 39/week @ 2024-07-01 45/week @ 2024-07-08 43/week @ 2024-07-15 59/week @ 2024-07-22

190 每月下载量
用于 2 crates

MIT 许可证

21KB
425 代码行

mock-it


Current Crates.io Version

模拟它,而不是模拟所有 🙃

我们的目标是提高测试依赖项时的开发体验。它允许你使用接近 given when then 的语法,而不是在调用你的函数之前必须断言你的 then

特性

  • 直观易用 😌
  • 模拟你的特质 🦾
  • 配置你的模拟 👷‍♀️
  • 分离配置和断言 🕵️‍♀️

示例

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

其他用例

约束

  • 特质输入必须实现 PartialEq 和 Clone
  • 特质输出必须实现 Clone

依赖项

~1.5MB
~36K SLoC