如何制作测试目录?

How to make a test dir?

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

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

问题是什么?我完全迷路了。

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

有两个问题。首先,你正在构建一个可执行文件,而不是一个库,所以你不能 link 针对结果来测试它。其次,您似乎对模块和板条箱之间的区别感到困惑。您可能想阅读 Crates and Modules chapter of the Rust book.

如果您希望您的 crate 中的类型和方法可以从外部访问,您需要将您的代码编译到一个库中。通常,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); }