如何制作测试目录?

pet*_*bel 6 unit-testing rust rust-cargo

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

SRC/main.rs

pub mod player;

fn main() {
    println!("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)

SRC/player.rs

pub fn rep(arg: i32) -> i32 {
    arg
}
Run Code Online (Sandbox Code Playgroud)

测试/ player.rs

extern crate player;

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

Cargo.toml

[package]
name = "myapp"
version = "0.1.0"
authors = ["My Name <spam@example.com>"]
Run Code Online (Sandbox Code Playgroud)

我相信代码与本书非常相似.但是,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
Run Code Online (Sandbox Code Playgroud)

问题是什么?我完全迷失了.

DK.*_*DK. 6

有两个问题.首先,您正在构建可执行文件,而不是库,因此您无法链接结果以进行测试.其次,你似乎对模块和板条箱之间的区别感到困惑.您可能想阅读Rust书中Crates and Modules章节.

如果您希望从包中可以从外部访问类型和方法,则需要将代码编译到库中.通常,Rust中的可执行文件只是围绕同名库的瘦包装器.所以,你可能有:

// src/main.rs
extern crate player;

fn main() {
    println!("rep(42): {:?}", player::rep(42));
}
Run Code Online (Sandbox Code Playgroud)

// src/lib.rs
pub fn rep(arg: i32) -> i32 { arg }
Run Code Online (Sandbox Code Playgroud)

这将允许您进行测试player::rep.

您可以做的另一件事就是在它正在测试的代码旁边编写测试.

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

#[test]
fn test_rep() { assert_eq!(rep(4), 4); }
Run Code Online (Sandbox Code Playgroud)