[英]How to use inline documentation for tests in rust
I am trying to get rust to test an example from my inline documentation.我正在尝试获取 rust 来测试我的内联文档中的示例。 I wrote the following code:
我写了以下代码:
#[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);
}
Then I run然后我跑
rustdoc --test src/main.rs
Which gave me:这给了我:
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
How can I get rustc to find flip and Color.我怎样才能让 rustc 找到翻转和颜色。 The test runs fine in the main function. I have also tried the command:
测试在主 function 中运行良好。我也尝试了命令:
cargo test
but that did not run any tests.但那没有运行任何测试。
I have tried add the following line to the example:我尝试将以下行添加到示例中:
/// use crate::{flip, Color};
making:制作:
// 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);
///```
but that gives an error但这会出错
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
I have also tried to Color and flip as public:我也试过公开着色和翻转:
#[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);
}
but that gave the same error.但这给出了同样的错误。
Doc tests (tests inside /// ```
) are compiled separately as tiny programs of their own. Doc 测试(在
/// ```
中的测试)作为它们自己的小程序单独编译。 Therefore:所以:
pub mod
, pub fn
, pub struct
, ...pub mod
、 pub fn
、 pub struct
、...main.rs
then it's a binary crate .main.rs
中,那么它就是一个二进制 crate 。use
the names, like use my_library::Color;
use
名称,例如use my_library::Color;
. If you want to test things that don't fit this, then you should use #[test]
tests instead:如果你想测试不适合这个的东西,那么你应该使用
#[test]
测试:
#[test]
fn flip_test() {
assert_eq!(flip(&Color::White), Color::Black);
}
Any function located anywhere in your program with the attribute #[test]
will be run as a test.位于程序中任何位置且具有属性
#[test]
的任何 function 都将作为测试运行。 So, they can access private items since they're in the same module (or a submodule; it's common to put them inside a module named tests
in the same file, with mod tests {... }
).因此,他们可以访问私有项,因为它们位于同一模块(或子模块;通常将它们放在同一文件中名为
tests
的模块中,使用mod tests {... }
)。
You can find more information about how to write test functions and organize your tests at The Rust Programming Language: How to Write Tests .您可以在Rust 编程语言:如何编写测试中找到有关如何编写测试函数和组织测试的更多信息。
I have also tried to Color and flip as public:
我也试过公开着色和翻转:
/// use crate::{flip, Color};
This doesn't work because crate
refers to the current crate, which for a doc test is the test program , not your main crate.这是行不通的,因为
crate
指的是当前的 crate,对于 doc test 来说是test program ,而不是你的主 crate。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.