首页 > 解决方案 > 仅针对跨多个 crate 的测试实现特征的惯用方法是什么?

问题描述

我在一个有几十个板条箱的工作区工作。其中一个板条箱暴露了一个特征。作为一个模拟,我在每个函数中实现了这个特征()unimplemented!它们实际上没有被使用)。我希望其他板条箱可以使用该实现,但仅在测试期间:这样做的惯用方式(最方便)是什么?

目前,实现是在一个mock特性后面,我将这个带有mock特性的板条箱作为开发依赖项添加到一个随机板条箱中。这迫使编译器在测试期间考虑该实现。这是一个丑陋的黑客,所以我宁愿有另一种方式。

标签: testingrust

解决方案


使用门控的项目test不会从板条箱中导出,即使对于将其用作开发依赖项的板条箱也是如此。

从 Rust 1.51.0 开始,您可以通过使用自定义功能来解决这个问题。

Cargo.toml

[features]
test-traits = []

在代码中:

#[cfg(feature = "test-traits")]
impl MyTrait for MyStruct {}

在依赖它的 crates 中,您可以启用新的解析器:

[package]
resolver = "2"

并添加一个启用该功能的开发依赖项:

[dev-dependencies]
your_crate = { version = "1.0", features = ["test-traits"] }

如果没有启用新的解析器,所有功能都是跨目标的附加功能,因此启用该功能dev-dependencies也会使其适用于非测试代码。使用新的解析器,现在的处理方式更符合您的预期。


推荐阅读