4

如何在创建的“测试”目录中访问我的库导出函数?

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问题?

4

2 回答 2

5

您的问题是,首先,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();
}
于 2014-10-15T20:03:09.493 回答
0

crate_id解决方案是在 src/relations.rs 的顶部指定 a :

#![crate_id = "relations"]
#![crate_type = "lib"]

pub fn foo() {
    println!("foo");
}

这似乎声明所有包含的代码都是“关系”模块的一部分,尽管我仍然不确定这与前面的mod块有何不同。

于 2014-10-15T19:58:52.887 回答