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 测试
190 每月下载量
用于 2 crates
21KB
425 代码行
mock-it
模拟它,而不是模拟所有 🙃
我们的目标是提高测试依赖项时的开发体验。它允许你使用接近 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