3 个版本
0.1.2 | 2023年12月30日 |
---|---|
0.1.1 | 2023年6月7日 |
0.1.0 | 2023年6月7日 |
#326 in 测试
39KB
1K SLoC
Expect Tests
Expect Tests 是一个受 rust-analyzer 的 expect-test 启发的 Rust crate。解释可以在 这里 找到。
基本用法
expect!(fibonacci(15), "610");
宏使用 Debug 特性的表示形式(除了字符串字面量)并与提供的字符串字面量进行比较。在发生不匹配的情况下,将显示包含差异的错误
You can update all `expect!` tests by running:
UPDATE_EXPECT=1 cargo test
To update a single test, place the cursor on `expect` token and use the `run` feature of rust-analyzer.
Expect:
----
987
----
Actual:
----
610
----
Diff:
----
987610
----
如果设置了 UPDATE_EXPECT
环境变量,宏将直接更新源文件以修复它。例如
expect!(fibonacci(15));
运行 UPDATE_EXPECT=1 cargo test
之后,您的源文件应自动更新为
expect!(fibonacci(15), "610");
多个 Expect
测试回调可能很麻烦,因为您需要将它们收集到 vec 中。这里有一个使用 expect!
的替代方案
fn some_complicated_io_func(callback: impl Fn(i32)) {
callback(5);
callback(3);
callback(10);
}
some_complicated_io_func(|status_value| {
expect!(status_value, "5", "3", "10");
});
注意:Expect-tests 无法检测到 expect!
宏从未被调用的情况。因此,以下循环即使 "2"、"3" 和 "4" 永远没有运行,也会通过
for i in 0..2 {
expect!(i, "0", "1", "2", "3", "4");
}
Expect 令牌
使用 expect 令牌测试 proc macros 现在更容易了
#[test]
fn test_enum() {
let output = quote! {
enum TrafficLight {
Red,
Yellow,
Green
}
};
expect_tokens!(
output,
r#"
enum TrafficLight {
Red,
Yellow,
Green,
}
"#
);
}
示例
查看用于测试此 crate 的 示例。
替代方案
其他说明
- 尽可能遵守 rustfmt。当宏检测到多行 expect 时,更新将尝试在适当的位置插入换行符。
- 在比较字符串字面量时忽略缩进,以使代码看起来更美观。
依赖关系
~95–360KB