3 个版本 (破坏性更新)
0.3.0 | 2023年11月17日 |
---|---|
0.2.0 | 2023年6月15日 |
0.1.0 | 2023年4月4日 |
在 测试 中排名 330
被 ndjson-stream 使用
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
}
}