1 个不稳定版本
0.0.1 | 2023年12月21日 |
---|
#35 在 #matcher
23KB
588 行
匹配器
to_eq
to_panic
to_be_in_range
to_match_array
或to_contain_exactly
有疑问的
to_have_len
to_be_empty
新想法
使用 std::panic::take_hook 和 set_hook
尝试使用 take_hook
和 set_hook
来干扰 ToPanic
匹配器的 panic 消息。同时考虑使用钩子来创建友好的 panic 消息。
显示测试名称
在 panic 消息中显示测试名称(函数名称)。
改进错误消息
Expected not to equal 4
Got 4
/home/sergey/dev/rust/expecto/src/main.rs:22
通过显示包含期望的代码片段
Expected not to equal 4
Got 4
expect(square(2)).not_to_eq(4);
/home/sergey/dev/rust/expecto/src/main.rs:22
这可以通过读取源代码文件来完成。
使用 #[must_use]
在 Subject 上添加 #[must_use]
,以确保正确测试主题。
失败的想法
// pub trait ToEq<R> {
// fn to_eq(self, rhs: R);
// fn not_to_eq(self, rhs: R);
// }
expect(2.0 + 2.0).to_eq(4.1);
通过使用另一个特质(希望如此)提供自定义错误消息作为第二个参数
// pub trait ToEqWithMsg<R> {
// fn to_eq(self, rhs: R, msg: impl Into<String>);
// fn not_to_eq(self, rhs: R, msg: impl Into<String>);
// }
expect(2.0 + 2.0).to_eq(4.1, "This should not happen!");
编译错误
error[E0034]: multiple applicable items in scope
--> src/main.rs:4:23
|
4 | expect(2.0 + 2.0).to_eq(4.1, "This should not happen!");
| ^^^^^ multiple `to_eq` found
|
= note: candidate #1 is defined in an impl of the trait `expecto::prelude::ToEq` for the type `Subject<L>`
= note: candidate #2 is defined in an impl of the trait `expecto::prelude::ToEqWithMsg` for the type `Subject<L>`
语法想法
// test target (subject)
let sum = 2 + 2;
// Old Ruby should
// Cons:
// * pollutes namespace with functions like `eq`
// * Probably too many parenthesis
sum.should(eq(4));
sum.should_not(eq(4).msg("Not four!"));
sum.must_eq(4);
sum.must_not_eq(4);
sum.must_not_eq(4);
expect(sum).to_eq(4)
.or(sum).to_eq(5);
所有匹配器都使用 Drop
impl<T: Matcher + ?Sized> Drop for T {
fn drop() {
println!("Goodbye matcher");
}
}
编译失败
|
98 | impl<T: Matcher + ?Sized> Drop for T {
| ^ type parameter `T` must be used as the type parameter for some local type
|
= note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local
= note: only traits defined in the current crate can be implemented for a type parameter
error[E0120]: the `Drop` trait may only be implemented for structs, enums, and unions
依赖关系
~3–13MB
~126K SLoC