如何制作测试目录?
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); }
我想建立一个基本的 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); }