如何制作测试目录?

时间:2015-08-01 07:24:14

标签: unit-testing rust rust-cargo

我想建立一个基本的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
}

测试/ 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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

您正在编译二进制文件而不是库(crate)。尝试重命名&#34; main.rs&#34;到&#34; lib.rs&#34;。