3 个版本 (破坏性更新)

0.3.0 2023年11月17日
0.2.0 2023年6月15日
0.1.0 2023年4月4日

测试 中排名 330


ndjson-stream 使用

MIT/Apache

500KB
10K SLoC

Kernal

Kernal (Kernal Extensive Rust Natural Assertion Language) 允许你在 Rust 测试中使用流畅的断言。也就是说,你不需要写 assert_eq!(my_vec.len(), 10),而是可以写 assert_that!(my_vec).has_length(10),这使得你的测试更加易读,并允许框架提供更具表达性的错误消息。Kernal 旨在为尽可能多的常见测试属性提供专门的断言。

编写断言

要为值编写断言,从 assert_that!(<你的值>) 开始,这将为你可以调用关联函数以编写断言的实例。从 prelude 模块导入专门的扩展特质,例如为 String 提供特殊断言的 StringAssertions。这为你提供了编写 Kernal 支持的每个断言所需的所有导入。

use kernal::prelude::*;

assert_that!("hello world").contains("world");

链式调用

每个断言都返回相同的断言实例,以在相同值上继续编写断言。此外,一些扩展特质定义了映射方法,以某种方式操作数据并返回新的数据上的断言实例。

assert_that!("almost")
    .has_char_length(6)
    .ends_with("most")
    .to_chars()
    .is_sorted_in_strictly_ascending_order();

创建自定义断言

Kernal 允许创建自定义断言,以便以更自然的方式测试你的类型的实例。这是通过将你希望为特定类型提供的断言分组到特质中,然后实现 assert_that 宏的输出类型来实现的。有关更多详细信息,请参阅 crate 级别文档 https://docs.rs/kernal/latest/kernal/。下面的示例演示了此过程。

// Our type for which we want to write assertions.
struct Vector2f32 { x: f32, y: f32 }

// The custom assertion trait we will later implement on `AssertThat`.
trait Vector2f32Assertions {
    // The custom assertion we want to supply. It is recommended to take an owned `self` and
    // return the same instance to support chaining.
    fn has_euclidean_norm(self, expected_norm: f32, epsilon: f32) -> AssertThat<Vector2f32>;
}

impl Vector2f32Assertions for AssertThat<Vector2f32> {
    fn has_euclidean_norm(self, expected_norm: f32, epsilon: f32) -> AssertThat<Vector2f32> {
        // We get our data with `self.data()`, supplied by `AssertThatData`
        let vector = self.data();
        let actual_norm = (vector.x * vector.x + vector.y * vector.y).sqrt();

        if (actual_norm - expected_norm).abs() > epsilon {
            // Here we must fail - using the `Failure` struct
            Failure::new(&self)
                .expected_it(format!("to have a euclidean norm within <{}> of <{}>",
                    epsilon, expected_norm))
                .but_it(format!("was <({}, {})>, with a euclidean norm of <{}>",
                    vector.x, vector.y, actual_norm))
                .fail()
        }

        // Here the test passes, so we return `self` for chaining
        self
    }
}

无运行时依赖