我想证明我的API通过无法编译来静态地防止无效使用。
有一些工具可以确保在运行时发生代码混乱(#[should_panic]
),但是我找不到任何编译失败的信息。 doc测试似乎是最有前途的,因为每个代码段都是一个单独的编译单元,但是似乎只有恐慌检查了。
答案 0 :(得分:4)
当前没有一种方法可以表明常规测试不应该编译。而且从相关问题(#521和#1994)来看,#[compile_fail]
之类的东西不太可能很快就会出现。
但是,还有其他两种方式编写这些测试。
自Rust 1.22起,您可以通过使用compile_fail
标记代码段来进行可能无法编译的 doc测试:
/// Foos a bar.
///
/// # Example
///
/// ```compile_fail
/// foo(3); // 3 is not a bar
/// ```
fn foo(bar: Bar) {
}
Rust项目内部使用的编译测试工具已提取到专用板条箱compiletest_rs
中。
使用documentation中建议的样板,可以在tests/compile-fail
文件夹中编写编译失败测试:
fn main() {
let x: bool = 0;
}
另请参阅:
尽管如此,这些测试应谨慎编写。引用compile_fail
功能的声明:
请注意,这类测试可能比其他测试更脆弱,因为Rust的添加可能导致代码在以前无法编译的情况下进行编译。