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)
问题是什么?我完全迷失了.
有两个问题.首先,您正在构建可执行文件,而不是库,因此您无法链接结果以进行测试.其次,你似乎对模块和板条箱之间的区别感到困惑.您可能想阅读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)
归档时间: |
|
查看次数: |
862 次 |
最近记录: |