You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust测试中crate::t_list导入失败问题求助

解决Rust集成测试中无法导入结构体的问题

错误原因

你的问题核心在于Cargo对二进制项目和库项目的处理逻辑差异:

  1. 初始项目是纯二进制项目(入口为src/main.rs),而tests目录下的集成测试文件是独立的crate,它们不会自动关联src/main.rs中的模块。crate::在测试文件中指向的是测试自身的crate根,而非你的主项目根,因此找不到t_list。
  2. 当你将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:33:14