如何在包的“tests”目录中访问导出的函数?

时间:2014-10-15 19:43:28

标签: rust rust-crates

如何在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问题?

2 个答案:

答案 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块有什么不同。