我想建立一个基本的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
有什么问题?我完全迷失了。
答案 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;。