Rust 如何从'src'导入函数进行测试?
几个小时以来,我一直在试图理解如何导入函数以在Rust中进行测试,但没有成功。我的项目结构如下所示:Rust 如何从'src'导入函数进行测试?,rust,Rust,几个小时以来,我一直在试图理解如何导入函数以在Rust中进行测试,但没有成功。我的项目结构如下所示: . ├── Cargo.lock ├── Cargo.toml ├── src │ ├── main.rs │ └── funcs │ ├── mod.rs │ └── hello.rs └── tests └── test_hello.rs src/funcs/mod.rs: pub mod hello; pub fn hello() { println!(&
.
├── Cargo.lock
├── Cargo.toml
├── src
│ ├── main.rs
│ └── funcs
│ ├── mod.rs
│ └── hello.rs
└── tests
└── test_hello.rs
src/funcs/mod.rs
:
pub mod hello;
pub fn hello() {
println!("{}", "hello!");
}
mod funcs;
fn main() {
funcs::hello::hello(); // this works
}
use <crate>::funcs;
src/funcs/hello.rs
:
pub mod hello;
pub fn hello() {
println!("{}", "hello!");
}
mod funcs;
fn main() {
funcs::hello::hello(); // this works
}
use <crate>::funcs;
src/main.rs
:
pub mod hello;
pub fn hello() {
println!("{}", "hello!");
}
mod funcs;
fn main() {
funcs::hello::hello(); // this works
}
use <crate>::funcs;
src/tests/test\u hello.rs
mod funcs; // this import does not work!
#[test]
fn add() {
assert_eq!(2 + 2, 4);
}
#[test]
fn hello_test() {
assert_eq!(funcs::hello::hello(), "hello");
}
如何在
src
中导入公共函数,以便它们可以在我的测试目录中使用?Rust将测试视为单独板条箱的一部分,因此您必须将使用您的板条箱名称::funcs
在测试顶部,其中您的_板条箱名称
是在货物中定义的主包装的板条箱名称。toml
Rust将测试视为单独板条箱的一部分,因此您必须将使用您的_板条箱名称::funcs
在测试顶部,其中您的包装箱名称
是您的主包装箱名称,如货物中所定义。toml
创建一个src/lib.rs
文件,将包装箱的大部分逻辑放入一个库包装箱中,并在那里导出funcs
模块:
pub mod funcs;
现在,您可以在任何地方使用库(其中包含模块)。在您的情况下,从src/main.rs
和tests/test\u hello.rs
:
pub mod hello;
pub fn hello() {
println!("{}", "hello!");
}
mod funcs;
fn main() {
funcs::hello::hello(); // this works
}
use <crate>::funcs;
use::funcs;
用与包名和根文件夹相同的库板条箱名称替换
。创建src/lib.rs
文件,将包的大部分逻辑放入库板条箱中,并将funcs
模块导出到其中:
pub mod funcs;
现在,您可以在任何地方使用库(其中包含模块)。在您的情况下,从src/main.rs
和tests/test\u hello.rs
:
pub mod hello;
pub fn hello() {
println!("{}", "hello!");
}
mod funcs;
fn main() {
funcs::hello::hello(); // this works
}
use <crate>::funcs;
use::funcs;
用与包名和根文件夹相同的库板条箱名称替换
。铁锈板条箱可以包含程序和/或库。测试只能访问库,而不能访问程序(并且只能访问库的公共部分)。在您的情况下,您只有一个程序,因此无法进行测试。为了使测试正常工作,您需要:
- 将代码拆分为程序(在
文件中)和库(在main.rs
文件中)lib.rs
- 确保要在程序中使用的库的任何部分都是公共的
- 确保要测试的库的任何部分也是公共的
- 在
和测试中,编写main.rs
访问使用foo::hello
函数,用库的名称替换hello
foo
如果要将代码拆分为模块,请在
lib.rs
中使用pub mod_name
声明每个模块,然后使用use foo::mod_name导入它们代码>在main.rs
或测试中。生锈板条箱可以包含程序和/或库。测试只能访问库,而不能访问程序(并且只能访问库的公共部分)。在您的情况下,您只有一个程序,因此无法进行测试。为了使测试正常工作,您需要:
- 将代码拆分为程序(在
main.rs
文件中)和库(在lib.rs
文件中)
- 确保要在程序中使用的库的任何部分都是公共的
- 确保要测试的库的任何部分也是公共的
- 在
main.rs
和测试中,编写使用foo::hello
访问hello
函数,用库的名称替换foo
如果要将代码拆分为模块,请在lib.rs
中使用pub mod_name
声明每个模块,然后使用use foo::mod_name导入它们代码>在main.rs
或测试中。mod
定义模块;它不导入模块。使用Use
导入模块。应该类似于使用板条箱::funcs代码>在测试中\u hello.rs
。感谢您的帮助。当我使用时,使用clarate::funcs
在test\u hello.rs
中,我得到错误:未解析的导入板条箱::funcs根目录中没有funcs
。我在main.rs
中看到mod funcs
,因此我不确定该错误的含义正如Acorn在下面的评论中所建议的那样,main.rs中的code>。mod
定义了一个模块;它不导入模块。使用Use
导入模块。应该类似于使用板条箱::funcs代码>在测试中\u hello.rs
。感谢您的帮助。当我使用时,使用clarate::funcs
在test\u hello.rs
中,我得到错误:未解析的导入板条箱::funcs根目录中没有funcs
。我在main.rs
中看到mod funcs
,因此我不确定该错误的含义代码>在main.rs
中,正如Acorn在下面的评论中所建议的那样。感谢您的帮助。在my Cargo.toml文件中,我的主包名为hello
。如果我添加使用hello::funcs
在test_hello.rs
文件的顶部,我得到一个错误:使用未声明的类型或模块hello
;谢谢你的帮助。在my Cargo.toml文件中,我的主包名为hello
。如果我添加使用hello::funcs
在test_hello.rs
文件的顶部,我得到一个错误:使用未声明的类型或模块hello
;谢谢你的帮助。当我移动pub mod funcs时
从main.rs
到lib.rs
这两个目录都在同一个src/
目录中,我现在得到一个错误,模块funcs的文件找不到。Rust进一步声明帮助:要创建模块
funcs,请创建文件“src/lib/funcs.rs”
。您使用的是2018版吗?是的,我使用的是2018版。奇怪的是,这应该可以工作。它应该是pub mod funcs代码>,因为您