Rust 无法在集成测试中导入模块
我正在尝试在Rust中配置一个示例项目 我的结构是:Rust 无法在集成测试中导入模块,rust,Rust,我正在尝试在Rust中配置一个示例项目 我的结构是: src/potter.rs tests/tests.rs 和我的Cargo.toml [package] name = "potter" version = "0.1.0" authors = ["my name"] [dependencies] Mypotter.rs包含: pub mod potter { pub struct Potter { } impl Potter { pub f
src/potter.rs
tests/tests.rs
Cargo.toml
[package]
name = "potter"
version = "0.1.0"
authors = ["my name"]
[dependencies]
Mypotter.rs
包含:
pub mod potter {
pub struct Potter {
}
impl Potter {
pub fn new() -> Potter {
return Potter {};
}
}
}
use potter::Potter;
#[test]
fn it_works() {
let pot = potter::Potter::new();
assert_eq!(2 + 2, 4);
}
我的测试.rs
包含:
pub mod potter {
pub struct Potter {
}
impl Potter {
pub fn new() -> Potter {
return Potter {};
}
}
}
use potter::Potter;
#[test]
fn it_works() {
let pot = potter::Potter::new();
assert_eq!(2 + 2, 4);
}
但我收到了这个错误:
错误[E0432]:未解析的导入`
-->测试/测试。rs:1:5
|
1 |使用波特::波特;
|^^^^^^^^^^^^^也许是一个丢失的“外部板条箱波特;”?
错误[E0433]:无法解析。使用未声明的类型或模块`
-->测试/测试。rs:6:19
|
6 |让波特=波特::波特::新();
|^^^^^^使用未声明的类型或模块`potter`
警告:未使用的导入:`potter::potter`
-->测试/测试。rs:1:5
|
1 |使用波特::波特;
| ^^^^^^^^^^^^^^
|
=注意:#[警告(未使用的_导入)]默认打开
如果我添加外部板条箱代码>,它无法修复任何问题
错误[E0463]:找不到“波特”的板条箱`
-->测试/测试。rs:1:1
|
1 |外部板条箱;
|^^^^^^^^^^^^^^^^^^^^^^^^^^找不到板条箱
返回并重试
常见痛点:
- 每一种编程语言都有自己处理文件的方式——你不能仅仅因为使用过其他语言就认为你会神奇地接受Rust的观点。这就是为什么你应该这么做
- 每个文件定义一个模块。您的
lib.rs
定义了一个与您的板条箱同名的模块;一个mod.rs
定义了一个与其所在目录同名的模块;每个其他文件定义一个文件名模块
- 库板条箱的根必须是
lib.rs
;二进制板条箱可以使用main.rs
- 不,您真的不应该尝试进行非惯用文件系统组织。做你想做的任何事都有诀窍;这些想法很糟糕,除非你已经是一个高级用户了
- 惯用Rust通常不像其他许多语言那样放置“每个文件一种类型”。是的,真的。一个文件中可以有多个内容
- 单元测试通常与正在测试的代码位于同一个文件中。有时它们会被分割成一个包含子模块的文件,但这并不常见
- 集成测试、示例和基准测试都必须像板条箱的任何其他用户一样导入板条箱,并且只能使用公共API
要解决您的问题,请执行以下操作:
将src/potter.rs
移动到src/lib.rs
从src/lib.rs
中删除pub mod potter
。不严格要求,但删除了不必要的模块嵌套
将extern-claiter-potter
添加到集成测试tests/tests.rs
李>
文件系统
├── 货锁
├── 货舱
├── src
│ └── 图书馆
├── 目标
└── 测验
└── 考克斯
src/lib.rs
pub struct Potter {}
impl Potter {
pub fn new() -> Potter {
Potter {}
}
}
use potter::Potter;
#[test]
fn it_works() {
let pot = Potter::new();
assert_eq!(2 + 2, 4);
}
测试/测试.rs
pub struct Potter {}
impl Potter {
pub fn new() -> Potter {
Potter {}
}
}
use potter::Potter;
#[test]
fn it_works() {
let pot = Potter::new();
assert_eq!(2 + 2, 4);
}
我删除了pub mod potter
,错误仍在继续。我应用了复制答案的解决方案,它似乎不起作用。我将我的potter.rs重命名为lib.rs,但它一直不起作用…我在测试/common.rs
中执行此操作:#[macro_use]extern claiter mylib代码>但是它说“外部板条箱
加载宏必须位于板条箱根”。所以我想知道哪个文件是测试目录的“板条箱根目录”?有没有类似于src/lib.rs的文件?@Nawaztests
目录中的每个文件都被编译为一个单独的二进制文件箱。每一个都是板条箱的根。另见。那么为什么#[macro_使用]外部代码>不适用于测试/common.rs
,它要求我放入一些板条箱根目录
。板条箱根目录是什么,似乎没有明确定义。因为您没有将其放在板条箱根目录下。“板条箱根”是一个定义良好的术语-它是板条箱的入口点。tests目录中的每个文件都被编译为一个单独的二进制文件箱。这意味着您的tests/common.rs
被编译为二进制文件,因此这是一个板条箱根(可能也不是您想要的)。假设您也将该文件作为模块从另一个文件导入,如tests/foo.rs
-foo.rs也是一个板条箱根目录。我将所有内容从tests/common.rs
移动到tests/common/mod.rs
,现在我可以执行mod common代码>在其他测试文件中。它起作用了。谢谢你的帮助。