我可以为无效的生命周期编写测试吗?

She*_*ter 6 testing rust

我正在编写一些操作原始指针的Rust代码.然后,这些原始指针通过结构向用户公开,这些结构使用ContravariantLifetime将结构的生命周期与我的对象联系起来.

我希望能够编写测试来验证面向用户的结构不能比我的对象更长寿.我有以下代码:

fn element_cannot_outlive_parts() {
    let mut z = {
         let p = Package::new();
         p.create() // returns an object that cannot live longer than p
    };
 }
Run Code Online (Sandbox Code Playgroud)

这无法编译,这正是我想要的.但是,我想进行一些自动检查,即使在对代码进行任何重构之后,这种行为也是如此.

我目前最好的想法是用这段代码编写一次性Rust文件并装配bash脚本以尝试编译它们并查找特定的错误消息,这些都感觉非常hacky.

She*_*ter 3

Rust 项目有一组特殊的测试,称为“编译失败”测试,可以完全满足您的需求。

compiletest是这个想法的提取,它允许其他库做同样的事情:

fn main() {
    let x: (u64, bool) = (true, 42u64);
    //~^ ERROR mismatched types
    //~^^ ERROR mismatched types
}
Run Code Online (Sandbox Code Playgroud)

一个可行的想法是使用 Cargo 的“功能”。

使用功能标志指定测试:

#[test]
#[cfg(feature = "compile_failure")]
fn bogus_test() {}
Run Code Online (Sandbox Code Playgroud)

将其添加到 Cargo.toml 中:

[features]

compile_failure = []
Run Code Online (Sandbox Code Playgroud)

并运行测试

cargo test --features compile_failure
Run Code Online (Sandbox Code Playgroud)

其中明显缺少的是“这是否是正确的失败”的自动检查。如果不出意外的话,这允许我在我的代码库中进行半实时的测试。