使用旧的 Rust 2015
0.1.0 |
|
---|
#146 in #unsafe
13KB
172 行
Rust 的免费不安全模拟
此软件包提供用于在测试代码中创建 trait 对象模拟实例的宏。
安装
该软件包可在 crates.io 上找到,其 Cargo.toml
文件如下
[dev-dependencies]
mock = "^0.1"
发布说明可在 GitHub 发布 下找到。
由于此软件包提供了一个宏,因此必须使用 #[macro_use]
属性导入
#[macro_use]
extern crate mock;
创建模拟
可以使用 mock!()
宏创建模拟。只需提供要模拟的 trait 名称。
let m = mock!(BestTrait);
trait 可以包含泛型。
let m = mock!(AsRef<String>);
返回的模拟立即可以使用。由于还没有模拟任何方法,任何方法调用都将执行 std::unreachable!()
。
fn use_trait(best: &BestTrait) {
// panics if `use_trait` invokes any methods that have not been mocked
}
use_trait(m);
可以通过提供函数体来模拟单个方法。假设 BestTrait
有一个签名为 fn compute(&self, usize, Vec<i32>) -> String
的方法。
mock!(m.compute(usize, Vec<i32>) -> String { "success".to_string() });
assert_eq!("success".to_string(), m.compute(3, vec![1, 4, 1, 5]));
可以模拟任何数量的 trait 方法。未模拟的方法将执行 std::unreachable!()
。
一个完整的示例代码如下
#[macro_use]
extern crate mock;
trait BestTrait {
fn compute(&self, usize, Vec<i32>) -> String;
fn other(&self, String) -> Result<bool, ()>;
}
#[test]
fn your_test() {
let m = mock!(BestTrait);
mock!(m.compute(usize, Vec<i32>) -> String { "success".to_string() });
// leave other() unimplemented
use_trait(m);
}
fn use_trait(best: &BestTrait) {
assert_eq!("success".to_string(), best.compute(3, vec![1, 4, 1, 5]));
}
许可证
许可协议为以下之一
- Apache 许可证第 2.0 版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则根据 Apache-2.0 许可证定义,您提交给本项目包含的任何贡献将被双重许可,如上所述,没有任何额外的条款或条件。