testing - 如何使用内联文档进行 rust 测试
问题描述
我正在尝试生锈以测试我的内联文档中的示例。我写了以下代码:
#[derive(Clone)]
#[derive(PartialEq)]
#[derive(Debug)]
enum Color {
Black = 1,
Empty = 0,
White = -1
}
/// Chages Color to the next player
///
/// Returns: White if player is Black, Black if player is White and Empty if
/// player is Empty.
///
/// Examlple
/// ```
/// assert_eq!(flip(&Color::White),Color::Black);
///```
// Invariant Color must represent Black as 1, Empty as 0 and White as -1!
fn flip(player: &Color)->Color{
let intrepresentation :i8 = (player.clone() as i8) * (-1);
unsafe{
std::mem::transmute(intrepresentation)
}
}
fn main() {
assert_eq!(flip(&Color::White),Color::Black);
}
然后我跑
rustdoc --test src/main.rs
这给了我:
running 1 test
test src/main.rs - flip (line 16) ... FAILED
failures:
---- src/main.rs - flip (line 16) stdout ----
error[E0433]: failed to resolve: use of undeclared type or module `Color`
--> src/main.rs:17:18
|
3 | assert_eq!(flip(&Color::White),Color::Black);
| ^^^^^ use of undeclared type or module `Color`
error[E0433]: failed to resolve: use of undeclared type or module `Color`
--> src/main.rs:17:32
|
3 | assert_eq!(flip(&Color::White),Color::Black);
| ^^^^^ use of undeclared type or module `Color`
error[E0425]: cannot find function `flip` in this scope
--> src/main.rs:17:12
|
3 | assert_eq!(flip(&Color::White),Color::Black);
| ^^^^ not found in this scope
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0425, E0433.
For more information about an error, try `rustc --explain E0425`.
Couldn't compile the test.
failures:
src/main.rs - flip (line 16)
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
我怎样才能让 rustc 找到翻转和颜色。测试在 main 函数中运行良好。我也试过命令:
cargo test
但这没有运行任何测试。
我尝试将以下行添加到示例中:
/// use crate::{flip, Color};
制造:
// Chages Color to the next player
///
/// Returns: White if player is Black, Black if player is White and Empty if
/// player is Empty.
///
/// Examlple
/// ```
/// use crate::{flip, Color};
/// assert_eq!(flip(&Color::White),Color::Black);
///```
但这给出了一个错误
martin@martin-laptop:~/test_code$ rustdoc --test src/main.rs
running 1 test
test src/main.rs - main (line 23) ... FAILED
failures:
---- src/main.rs - main (line 23) stdout ----
error[E0432]: unresolved import `crate::Color`
--> src/main.rs:24:14
|
3 | use crate::{ Color};
| ^^^^^ no `Color` in the root
error[E0425]: cannot find function `flip` in this scope
--> src/main.rs:25:12
|
4 | assert_eq!(flip(&Color::White),Color::Black);
| ^^^^ not found in this scope
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0425, E0432.
For more information about an error, try `rustc --explain E0425`.
Couldn't compile the test.
failures:
src/main.rs - main (line 23)
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
我也尝试过公开颜色和翻转:
#[derive(Clone)]
#[derive(PartialEq)]
#[derive(Debug)]
pub enum Color {
Black = 1,
Empty = 0,
White = -1
}
/// Chages Color to the next player
///
/// Returns: White if player is Black, Black if player is White and Empty if
/// player is Empty.
///
/// Examlple
/// ```
/// use crate::{flip, Color};
/// use std::env;
/// assert_eq!(flip(&Color::White),Color::Black);
///```
// Invariant Color must represent Black as 1, Empty as 0 and White as -1!
pub fn flip(player: &Color)->Color{
let intrepresentation :i8 = (player.clone() as i8) * (-1);
unsafe{
std::mem::transmute(intrepresentation)
}
}
fn main() {
assert_eq!(flip(&Color::White),Color::Black);
}
但这给出了同样的错误。
解决方案
文档测试(里面的测试/// ```
)被单独编译为它们自己的小程序。所以:
- 他们只能访问公共项目:
pub mod
,pub fn
,pub struct
, ... - 他们只能访问导出项目以供其他 crate 使用的库 crate——如果您的程序在其中,
main.rs
那么它就是一个二进制 crate。 - 您必须完全限定或
use
名称,例如use my_library::Color;
.
如果你想测试不适合这个的东西,那么你应该使用#[test]
测试来代替:
#[test]
fn flip_test() {
assert_eq!(flip(&Color::White), Color::Black);
}
位于程序中任何位置的具有该属性的任何函数都#[test]
将作为测试运行。因此,他们可以访问私有项目,因为它们位于同一个模块(或子模块;通常将它们放在tests
同一个文件中命名的模块中,使用mod tests { ... }
)。
您可以在Rust 编程语言:如何编写测试中找到有关如何编写测试函数和组织测试的更多信息。
我也尝试过公开颜色和翻转:
/// use crate::{flip, Color};
这不起作用,因为crate
指的是当前 crate,对于 doc test 来说,它是test program,而不是你的 main crate。
推荐阅读
- c# - 最佳方式提示用户 4 .txt,阅读它,用“,”分隔,迭代 2 在 C# 中用“A”、“a”、相同的 4“Z”、“z”找到第一个 str?
- r - 从回归输出手动计算交互的拟合值
- javascript - 如何制作进度条?
- vpn - stunnel4 错误。内部错误:ssl.c 的魔法不好,第 117 行
- ms-access-2007 - 当外键在同一个表中被引用两次时,是否可以强制执行引用完整性?
- python - 如何使这个 python 程序多处理或多线程
- r - 在不改变标题格式的情况下,如何在 R 中将括号添加到点须?
- git - 如何使用先前更改、当前更改和来自另一个分支的新文件创建新分支?
- javascript - Ionic 4:ion-textarea setfocus 未将光标设置在文本的最后位置
- javascript - 如何使用信号器将数据从集线器传递到查看