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

如何在主代码库中引用内部依赖thing的测试工具代码?

问题原因

#[cfg(test)]标记的模块和函数仅会在编译thing自身的测试目标时被包含进编译结果。当你的主项目将thing作为常规依赖引入时,Cargo会编译thing的库目标而非测试目标,此时thing::bit::tests模块根本不会被编译,自然无法被主项目引用。

解决方案

基于你无法修改主项目[dependencies]配置的限制,分两种场景处理:

场景1:可修改thing的代码

把测试工具代码从#[cfg(test)]模块中抽离,放到公共测试工具模块,让主项目测试能够访问:

  1. 修改thing/src/bit/mod.rs,新增测试工具模块并保留原测试逻辑的复用:
// thing/src/bit/mod.rs
// 测试工具模块,仅在测试环境或开启test_utils特性时编译
#[cfg(any(test, feature = "test_utils"))]
pub mod test_utils {
    pub fn setup_testable_thingy() {
        // 原工具函数实现
    }
    pub fn remove_testable_thingy() {
        // 原工具函数实现
    }
}

// 原测试模块,复用新的测试工具
#[cfg(test)]
mod tests {
    use super::test_utils::*;

    #[test]
    fn example_test() {
        setup_testable_thingy();
        // 原有测试逻辑
        remove_testable_thingy();
    }
}
  1. 主项目测试代码中直接引用新模块:
// src/submod/part.rs
#[cfg(test)]
mod tests {
    use super::*;
    use thing::bit::test_utils::{setup_testable_thingy, remove_testable_thingy};

    #[test]
    fn my_custom_test() {
        setup_testable_thingy();
        // 你的测试逻辑
        remove_testable_thingy();
    }
}

如果需要更严格的访问控制,可给thing添加test_utils特性(在thing/Cargo.toml中):

[features]
test_utils = []

然后在主项目的[dev-dependencies]中补充(若允许修改这部分配置):

[dev-dependencies]
thing = { path = "./thing", features = ["test_utils"] }

场景2:完全无法修改thing的代码

这种情况只能采用临时方案:直接将thing中setup_testable_thingy、remove_testable_thingy等工具函数的代码复制到主项目的测试模块中。缺点是会产生代码重复,后续thing中工具函数更新时需要同步复制。

内容的提问来源于stack exchange,提问作者pm100

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:02:36