我目前正在编写一些不安全的代码,这些代码需要一定程度的手动管理生命周期,并将这些生命周期公开给外部用户。我一直在编写测试,虽然编写测试来验证编译代码的正确性非常容易(至少在未定义行为的可能性允许的范围内),但我一直在寻求确保某些类型的不健全代码无法编译。
假设我有以下人为的示例:
pub struct MyBox<T> {
ptr: *mut T,
}
impl<T> MyBox<T> {
fn new(t: T) -> Self {
MyBox {
ptr: Box::into_raw(Box::new(t)),
}
}
fn get(&self) -> &T {
unsafe { &*self.ptr }
}
}
impl<T> Drop for MyBox<T> {
fn drop(&mut self) {
unsafe { Box::from_raw(self.ptr) }
}
}
fn test<'a>() -> &'a i32 {
MyBox::new(7).get()
}
Run Code Online (Sandbox Code Playgroud)
如何确保该test函数不会继续从 rust 的测试框架编译失败?
显然,只需将错误的代码放入单独的文件中并使用实际的测试函数作为美化的构建脚本就可以了,但这确实是样板文件和尴尬的,特别是当我想测试的坏示例不止一两个时。如果有帮助,我不关心错误的细节,只关心错误的存在。
您可以将其编写为带有 attr 的 doctest compile_fail,以便您可以在注释中编写多个预计会同时失败的测试。
/// ```compile_fail,E0515
/// use path_to::MyBox;
///
/// fn test<'a>() -> &'a i32 {
/// MyBox::new(7).get()
/// }
/// ```
fn _doc_test() {}
Run Code Online (Sandbox Code Playgroud)
,E0515指示您期望的错误号,这可以避免导致测试误报的任何其他错误。(如果货物没有每晚运行,则此错误号检查将被忽略)
请注意,这要求您的板条箱是 alib而不是 a bin,因为bindoctests 目前不支持。(问题#50784)
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |