#expect #snapshot #string-literal

nightly expect-tests

(更优秀的)极简快照测试库

3 个版本

0.1.2 2023年12月30日
0.1.1 2023年6月7日
0.1.0 2023年6月7日

#326 in 测试

MIT/Apache

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