如何在原始机箱中使用来自另一个机箱的特性实现



我有一个Rust项目,它在一个工作区中划分为几个板条箱。其中一个板条箱是一个测试板条箱,用于在其他板条箱中进行单元和集成测试。

在一个机箱中,我定义了一个由测试机箱中的结构实现的特性。然而,当我尝试在定义特征的原始机箱中使用测试机箱中的结构时,我在尝试使用特征的成员函数时会遇到错误。

下面是一个简短的例子:

project-trait机箱中:

trait Trait {
fn do_something(&self)
}

project-test机箱中:

use project_trait::Trait;
pub struct TestObject;
impl Trait for TestObject {
fn do_something(&self) {
// ...
}
}

最后,回到project-trait机箱:

#[cfg(test)]
mod test {
use crate::Trait;
use project_test::TestObject;
#[test]
fn use_test_object() {
let object = TestObject;
object.do_something();
}
}

当在project-trait机箱中运行cargo test时,我得到错误E0599,它说我应该导入project_trait::Trait以使用do_something方法。Rust似乎没有发现crate::Traitproject_trait::Trait是相同的特征。

对此有什么变通办法吗?

机箱依赖关系图中不能有循环。因此,无论您在项目配置中实际做了什么,依赖于project-test#[cfg(test)]代码都不可能使用与project-test所认为的project_trait::Trait相同的crate::Trait

您可能已经做了一些事情,导致某些代码被编译为不同机箱的一部分(例如滥用mod以便在两个机箱中编译相同的源文件(。这样做的结果是,你有两个不同的特征,恰好都被命名为Trait。因此,您会得到一个错误,因为TestObject实现的与您导入的不相同。

(为了更准确地解释出了什么问题,你需要提供一个更完整的例子——最好是可复制的,即"如果我把这些文件复制到本地文件夹中,它们就足以证明问题"。(

通常,运行project-trait的测试所需的任何代码都必须是project-trait机箱或其依赖项的一部分——您不能将测试助手拆分为一个独立的库机箱。

最新更新