我有一个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::Trait
和project_trait::Trait
是相同的特征。
对此有什么变通办法吗?
机箱依赖关系图中不能有循环。因此,无论您在项目配置中实际做了什么,依赖于project-test
的#[cfg(test)]
代码都不可能使用与project-test
所认为的project_trait::Trait
相同的crate::Trait
。
您可能已经做了一些事情,导致某些代码被编译为不同机箱的一部分(例如滥用mod
以便在两个机箱中编译相同的源文件(。这样做的结果是,你有两个不同的特征,恰好都被命名为Trait
。因此,您会得到一个错误,因为TestObject
实现的与您导入的不相同。
(为了更准确地解释出了什么问题,你需要提供一个更完整的例子——最好是可复制的,即"如果我把这些文件复制到本地文件夹中,它们就足以证明问题"。(
通常,运行project-trait
的测试所需的任何代码都必须是project-trait
机箱或其依赖项的一部分——您不能将测试助手拆分为一个独立的库机箱。