Rust测试中crate::t_list导入失败问题求助
解决Rust集成测试中无法导入结构体的问题
错误原因
你的问题核心在于Cargo对二进制项目和库项目的处理逻辑差异:
- 初始项目是纯二进制项目(入口为
src/main.rs),而tests目录下的集成测试文件是独立的crate,它们不会自动关联src/main.rs中的模块。crate::在测试文件中指向的是测试自身的crate根,而非你的主项目根,因此找不到t_list。 - 当你将
list.rs改名为lib.rs后,项目变为库+二进制的混合项目(src/lib.rs作为库入口,src/main.rs作为二进制入口)。此时你的库拥有了公开的crate名称(对应Cargo.toml中的name字段),测试文件会自动将该库作为外部依赖引入,因此可以通过use <crate_name>::t_list;成功导入。
规范用法
推荐采用库+二进制的混合项目结构,这是Cargo测试的标准实践:
1. 调整项目结构(无需移动文件)
- 在
src目录下创建lib.rs,用于导出需要被测试的模块:// src/lib.rs pub mod list; - 保留
src/list.rs内容不变,确保t_list是pub可见的(你已实现)。 src/main.rs可继续保留作为二进制入口,若需使用t_list,通过库名称导入即可:// src/main.rs use libasm_tester::list::t_list; // 替换为你Cargo.toml中name字段的值 fn main() { println!("Run `cargo test` to test your libasm!"); }
2. 调整测试文件的导入语句
在tests/ft_list_push_front.rs中,通过库名称导入t_list:
use libasm_tester::list::t_list; // 替换为你的Cargo.toml中的name值 use std::{ ffi::{c_void, CString}, ptr::{null, null_mut}, }; extern "C" { fn ft_list_push_front(list: *mut *mut t_list, data: *const c_void) -> (); } #[test] fn ft_list_push_front_00() { /* ... */ }
备选方案(纯二进制项目临时解决)
如果坚持使用纯二进制项目,可在测试文件中通过路径直接导入模块(不推荐,路径依赖项目结构,易出错):
// tests/ft_list_push_front.rs #[path = "../src/list.rs"] mod list; use list::t_list; // 其余代码不变
关键知识点
- Cargo的
tests目录用于集成测试,主要针对库项目的公开API设计。 - 纯二进制项目的测试更适合用单元测试(直接在
src文件中添加#[test]标注的测试函数)。 - 混合项目中,库crate负责提供公共代码和API,二进制crate负责业务逻辑,集成测试针对库crate的API验证功能。
内容的提问来源于stack exchange,提问作者jodufour
相关产品推荐
相关产品推荐

