Cargo测试因文档测试失败报错,但我未编写任何文档测试或文档注释
Cargo测试因文档测试失败报错,但我未编写任何文档测试或文档注释
这种情况确实挺让人摸不着头脑的——明明没写任何文档测试,却被doctest环节的编译错误卡住了。我来帮你一步步排查和解决:
首先,确认问题范围
先把单元测试和doctest的错误分离开:
- 运行
cargo test --lib只执行库的单元测试。如果这个命令能正常通过,说明错误确实出在doctest的编译/执行阶段;如果还是报错,那问题其实和doctest无关,是你的库代码本身的编译问题。
可能的原因和解决办法
1. thiserror版本与Rust版本不兼容
你的错误出在#[derive(Error)]宏展开阶段,找不到core::write,这大概率是thiserror的宏实现对标准库路径的引用,和你当前的Rust版本不兼容。
- 先检查Rust版本:运行
rustc --version,thiserror 1.0+要求Rust 1.46及以上版本。如果版本过低,执行rustup update stable升级到最新稳定版。 - 然后更新
thiserror依赖:在Cargo.toml中指定最新稳定版本,比如:
再执行thiserror = "1.0"cargo update拉取最新版本的依赖。
2. 临时禁用doctest验证(快速定位)
如果你想先确认是不是doctest环节的问题,可以直接在Cargo.toml的[lib]部分禁用doctest:
[lib] doctest = false
再运行cargo test,如果能正常通过,那说明问题确实出在doctest的编译环境中。不过这只是临时方案,还是建议找到根本原因。
3. 检查第三方错误类型的依赖问题
你在Error枚举中用#[error(transparent)]引入了sqlx和sea_query的错误类型,有可能是这些依赖的错误类型在doctest编译环境中缺少必要的导入或依赖项。
- 可以尝试临时注释掉
Sqlx和SeaQuery这两个variant,再运行cargo test。如果错误消失,说明是这两个依赖的版本问题,升级它们到最新稳定版应该能解决:sqlx = { version = "0.7", features = [...] } # 替换成你实际需要的features sea-query = "0.30"
4. 展开宏查看生成的代码
如果上面的方法都没解决,可以用cargo expand工具查看#[derive(Error)]生成的具体代码,定位core::write的引用问题:
- 先安装工具:
cargo install cargo-expand - 运行命令展开宏:
查看生成的代码中是否有错误的cargo expand --package your-core-crate-name core::error::Errorcore::write引用(正确路径应该是core::fmt::write)。如果是宏的问题,升级thiserror肯定能解决。
最后总结
最可能的根源是thiserror或其依赖的版本与你的Rust版本不匹配,导致宏生成的代码在doctest编译环境中找不到正确的标准库路径。先尝试升级Rust和thiserror版本,应该能快速解决问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

