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
}

测试/player.rs

extern crate player;

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

货运.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

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

4

2 回答 2

6

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

如果你希望你的 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); }
于 2015-08-01T08:33:25.960 回答
2

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

于 2015-08-01T08:25:18.487 回答