如何在create" tests"中访问我的库导出函数? ?目录
的src / relations.rs:
#![crate_type = "lib"]
mod relations {
pub fn foo() {
println!("foo");
}
}
测试/ test.rs:
use relations::foo;
#[test]
fn first() {
foo();
}
$ cargo test
Compiling relations v0.0.1 (file:///home/chris/github/relations)
/home/chris/github/relations/tests/test.rs:1:5: 1:14 error: unresolved import `relations::foo`. Maybe a missing `extern crate relations`?
/home/chris/github/relations/tests/test.rs:1 use relations::foo;
^~~~~~~~~
如果我添加建议的extern crate relations
,则错误为:
/home/chris/github/relations/tests/test.rs:2:5: 2:19 error: unresolved import `relations::foo`. There is no `foo` in `relations`
/home/chris/github/relations/tests/test.rs:2 use relations::foo;
^~~~~~~~~~~~~~
我想在这个单独的relations
文件中测试我的tests/test.rs
。如何解决这些use
问题?
答案 0 :(得分:4)
您的问题是,首先,mod relations
不公开,因此在箱子外不可见,其次,您不会在测试中导入您的箱子。
如果您使用Cargo构建程序,则crate名称将是您在Cargo.toml
中定义的名称。例如,如果Cargo.toml
如下所示:
[package]
name = "whatever"
authors = ["Chris"]
version = "0.0.1"
[lib]
name = "relations" # (1)
src/lib.rs
文件包含:
pub mod relations { // (2); note the pub modifier
pub fn foo() {
println!("foo");
}
}
然后你可以在tests/test.rs
:
extern crate relations; // corresponds to (1)
use relations::relations; // corresponds to (2)
#[test]
fn test() {
relations::foo();
}
答案 1 :(得分:0)
解决方案是在src / relations.rs:
的顶部指定一个crate_id
#![crate_id = "relations"]
#![crate_type = "lib"]
pub fn foo() {
println!("foo");
}
这似乎宣称所有包含的代码都是"关系的一部分"模块,虽然我还不确定这与早期的mod
块有什么不同。