如何创建一个测试目录?

7

我想建立一个基本的hello world项目。单元测试应该在test/目录中,如书籍所述。到目前为止,我的代码如下。

src/main.rs

pub mod player;

fn main() {
    println!("Hello, world!");
}

src/player.rs

pub fn rep(arg: i32) -> i32 {
    arg
}

tests/player.rs

extern crate player;

#[test]
fn it_works() {
    assert_eq!(4, player::rep(2+2));
}

Cargo.toml

[package]
name = "myapp"
version = "0.1.0"
authors = ["My Name <spam@example.com>"]

我认为代码与书中非常相似。然而,cargo test 失败了:

tests/player.rs:1:1: 1:21 error: can't find crate for `player`
tests/player.rs:1 extern crate player;
              ^~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

什么问题?我完全迷失了。


你可能需要添加 Cargo.toml 文件的内容;这会决定事物的名称,也许是导致你问题的原因。 - DK.
@DK,请查看我的Cargo.toml编辑。谢谢。 - petrbel
2个回答

6
有两个问题。首先,您正在构建一个可执行文件,而不是库,因此无法链接结果以进行测试。其次,您似乎对模块和板条箱的区别感到困惑。您可能需要阅读 Rust 书中的 板条箱和模块章节
如果要使您的板条箱中的类型和方法在外部可访问,则需要将代码编译为库。通常,在 Rust 中,可执行文件只是同名库的薄包装器。因此,您可能会有:
// src/main.rs
extern crate player;

fn main() {
    println!("rep(42): {:?}", player::rep(42));
}

// src/lib.rs
pub fn rep(arg: i32) -> i32 { arg }

这将允许您测试player::rep
另一件事是在测试代码旁边编写测试。
// src/lib.rs
pub fn rep(arg: i32) -> i32 { arg }

#[test]
fn test_rep() { assert_eq!(rep(4), 4); }

2
你正在编译二进制文件而不是库文件(crate)。尝试将 "main.rs" 重命名为 "lib.rs"。

哦,但我打算制作一个二进制文件,这个项目的结果应该是一个可执行文件... - petrbel
2
测试目录用于测试库的函数API。由于二进制文件没有这些内容,因此在这种情况下使用测试目录并没有太多意义。您需要使用内部测试模块来测试二进制文件。 - Zarathustra30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接