Rust如何为私有模块内结构体方法编写无需公开模块的文档测试
解决方案
方案1:添加仅文档测试生效的条件重导出(最推荐)
在你的lib.rs中添加如下代码:
// 仅在运行文档测试时将目标结构体公开导出到 crate 根 #[cfg(doctest)] pub use reader::BufferedOpenTypeFontReader;
这一导出仅在cargo test执行文档测试的编译阶段生效,正常编译发布库时不会暴露任何内部实现,完全符合你不公开reader模块的需求。
之后你的文档示例可以直接通过crate根导入结构体,例如:
# use your_crate_name::BufferedOpenTypeFontReader; let reader = BufferedOpenTypeFontReader::new(/* 传入参数 */);
开头带# 前缀的导入行会参与编译测试,但不会渲染到最终的文档页面中,不影响用户阅读体验。
方案2:使用doc(test)属性放宽可见性(Rust 1.62+ 支持)
你也可以直接在私有模块的声明上添加属性,仅在文档测试阶段放开模块可见性:
#[cfg_attr(doctest, doc(test(visible)))] mod reader;
该属性不会改变正常编译时的模块私有属性,仅作用于文档测试的编译阶段,文档示例中可以直接导入reader模块下的公开结构体。
方案3:迁移为内部单元测试
如果你不想修改任何模块可见性相关配置,可以把文档示例的代码迁移到reader模块内部的#[cfg(test)]单元测试块中,文档侧仅保留示例代码说明即可,缺点是无法保证文档示例和测试逻辑自动同步。
内容的提问来源于stack exchange,提问作者Complexity
相关产品推荐
相关产品推荐

