#unsafe #mocking #object #traits #gratuitously

已下架 mock

免费不安全的模拟

使用旧的 Rust 2015

0.1.0 2016年4月3日

#146 in #unsafe

MIT/Apache

13KB
172

Rust 的免费不安全模拟

Build Status Latest Version

此软件包提供用于在测试代码中创建 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 许可证定义,您提交给本项目包含的任何贡献将被双重许可,如上所述,没有任何额外的条款或条件。

无运行时依赖项