Rust项目中tests目录无法被Cargo识别的问题解决方法
问题解决步骤
你的核心问题出在目录结构错误和crate类型不匹配,以下是具体修复方案:
1. 调整测试目录位置
Cargo默认将项目根目录下的tests/作为集成测试目录,而你把tests放在了src/内部,Cargo不会识别这个位置的测试文件。
把src/tests/整个目录移动到项目根目录,最终结构应该是:
. ├── Cargo.lock ├── Cargo.toml ├── src │ ├── ll │ │ ├── implementation.rs │ │ ├── mod.rs │ │ └── node.rs │ ├── lib.rs # 新增文件 │ └── main.rs └── tests └── ll.rs
2. 配置lib crate以支持测试引用
你的项目目前是binary crate(包含main.rs),binary crate无法被其他crate(包括测试crate)引用。需要把核心数据结构代码导出为lib crate:
- 在
src/下新建lib.rs文件,内容如下:
pub mod ll;
- 修改
src/ll/mod.rs,确保子模块对外可见:
pub mod implementation; pub mod node;
- 确保
src/ll/implementation.rs中的LList结构体及相关成员、方法是公开的(添加pub关键字):
pub struct LList { pub head: ..., // 测试需访问的成员也要加pub } impl LList { pub fn new(data: i32) -> Self { // 你的实现代码 } }
3. 修正测试文件的引用路径
修改tests/ll.rs中的代码,通过lib crate名称导入LList(对应Cargo.toml中name字段的值,连字符需替换为下划线):
use data_structures_in_rust::ll::implementation::LList; #[test] fn create_list() { let list = LList::new(1); assert_eq!(list.head.data, 1); }
4. 运行测试
现在执行cargo test,Cargo会自动编译lib crate并运行tests/ll.rs中的测试用例,Rust Analyzer也能正确识别测试代码的类型。
补充:单元测试的写法
如果需要写和代码耦合更紧密的单元测试,可以直接在src/ll/implementation.rs中添加:
#[cfg(test)] mod tests { use super::*; #[test] fn create_list() { let list = LList::new(1); assert_eq!(list.head.data, 1); } }
这种单元测试不需要调整目录,运行cargo test也会自动执行。
内容的提问来源于stack exchange,提问作者Tâmer Cuba
相关产品推荐
相关产品推荐

