如何在主代码库中引用内部依赖thing的测试工具代码?
问题原因
#[cfg(test)]标记的模块和函数仅会在编译thing自身的测试目标时被包含进编译结果。当你的主项目将thing作为常规依赖引入时,Cargo会编译thing的库目标而非测试目标,此时thing::bit::tests模块根本不会被编译,自然无法被主项目引用。
解决方案
基于你无法修改主项目[dependencies]配置的限制,分两种场景处理:
场景1:可修改thing的代码
把测试工具代码从#[cfg(test)]模块中抽离,放到公共测试工具模块,让主项目测试能够访问:
- 修改
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(); } }
- 主项目测试代码中直接引用新模块:
// 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
相关产品推荐
相关产品推荐

