繁体   English   中英

如何使用内联文档进行测试 rust

[英]How to use inline documentation for tests in rust

我正在尝试获取 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 找到翻转和颜色。 测试在主 function 中运行良好。我也尝试了命令:

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);
}

但这给出了同样的错误。

Doc 测试(在/// ```中的测试)作为它们自己的小程序单独编译 所以:

  • 他们只能访问公共项目: pub modpub fnpub struct 、...
  • 他们只能访问导出项目以供其他 crate 使用的库 crate——如果你的程序在main.rs中,那么它就是一个二进制 crate
  • 您必须完全限定或use名称,例如use my_library::Color; .

如果你想测试不适合这个的东西,那么你应该使用#[test]测试:

#[test]
fn flip_test() {
    assert_eq!(flip(&Color::White), Color::Black);
}

位于程序中任何位置且具有属性#[test]的任何 function 都将作为测试运行。 因此,他们可以访问私有项,因为它们位于同一模块(或子模块;通常将它们放在同一文件中名为tests的模块中,使用mod tests {... } )。

您可以在Rust 编程语言:如何编写测试中找到有关如何编写测试函数和组织测试的更多信息。


我也试过公开着色和翻转:

 /// use crate::{flip, Color};

这是行不通的,因为crate指的是当前的 crate,对于 doc test 来说是test program ,而不是你的主 crate。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM