Rust 无法在集成测试中导入模块

Rust 无法在集成测试中导入模块,rust,Rust,我正在尝试在Rust中配置一个示例项目 我的结构是: src/potter.rs tests/tests.rs 和我的Cargo.toml [package] name = "potter" version = "0.1.0" authors = ["my name"] [dependencies] Mypotter.rs包含: pub mod potter { pub struct Potter { } impl Potter { pub f

我正在尝试在Rust中配置一个示例项目

我的结构是:

  • src/potter.rs
  • tests/tests.rs
和我的
Cargo.toml

[package]
name = "potter"
version = "0.1.0"
authors = ["my name"]
[dependencies]
My
potter.rs
包含:

pub mod potter {
    pub struct Potter {

    }

    impl Potter  {
        pub fn new() -> Potter {
         return Potter {};
        }
    }

}
use potter::Potter;

    #[test]
    fn it_works() {

        let pot = potter::Potter::new();
        assert_eq!(2 + 2, 4);
    }
我的
测试.rs
包含:

pub mod potter {
    pub struct Potter {

    }

    impl Potter  {
        pub fn new() -> Potter {
         return Potter {};
        }
    }

}
use potter::Potter;

    #[test]
    fn it_works() {

        let pot = potter::Potter::new();
        assert_eq!(2 + 2, 4);
    }
但我收到了这个错误:

错误[E0432]:未解析的导入`
-->测试/测试。rs:1:5
|
1 |使用波特::波特;
|^^^^^^^^^^^^^也许是一个丢失的“外部板条箱波特;”?
错误[E0433]:无法解析。使用未声明的类型或模块`
-->测试/测试。rs:6:19
|
6 |让波特=波特::波特::新();
|^^^^^^使用未声明的类型或模块`potter`
警告:未使用的导入:`potter::potter`
-->测试/测试。rs:1:5
|
1 |使用波特::波特;
|     ^^^^^^^^^^^^^^
|
=注意:#[警告(未使用的_导入)]默认打开
如果我添加
外部板条箱,它无法修复任何问题

错误[E0463]:找不到“波特”的板条箱`
-->测试/测试。rs:1:1
|
1 |外部板条箱;
|^^^^^^^^^^^^^^^^^^^^^^^^^^找不到板条箱
返回并重试

常见痛点:

  • 每一种编程语言都有自己处理文件的方式——你不能仅仅因为使用过其他语言就认为你会神奇地接受Rust的观点。这就是为什么你应该这么做

  • 每个文件定义一个模块。您的
    lib.rs
    定义了一个与您的板条箱同名的模块;一个
    mod.rs
    定义了一个与其所在目录同名的模块;每个其他文件定义一个文件名模块

  • 库板条箱的根必须是
    lib.rs
    ;二进制板条箱可以使用
    main.rs

  • 不,您真的不应该尝试进行非惯用文件系统组织。做你想做的任何事都有诀窍;这些想法很糟糕,除非你已经是一个高级用户了

  • 惯用Rust通常不像其他许多语言那样放置“每个文件一种类型”。是的,真的。一个文件中可以有多个内容

  • 单元测试通常与正在测试的代码位于同一个文件中。有时它们会被分割成一个包含子模块的文件,但这并不常见

  • 集成测试、示例和基准测试都必须像板条箱的任何其他用户一样导入板条箱,并且只能使用公共API


要解决您的问题,请执行以下操作:

  • src/potter.rs
    移动到
    src/lib.rs
  • src/lib.rs
    中删除
    pub mod potter
    。不严格要求,但删除了不必要的模块嵌套
  • extern-claiter-potter
    添加到集成测试
    tests/tests.rs
    文件系统

    ├── 货锁
    ├── 货舱
    ├── src
    │   └── 图书馆
    ├── 目标
    └── 测验
    └── 考克斯
    
    src/lib.rs

    pub struct Potter {}
    
    impl Potter {
        pub fn new() -> Potter {
           Potter {}
        }
    }
    
    use potter::Potter;
    
    #[test]
    fn it_works() {
        let pot = Potter::new();
        assert_eq!(2 + 2, 4);
    }
    
    测试/测试.rs

    pub struct Potter {}
    
    impl Potter {
        pub fn new() -> Potter {
           Potter {}
        }
    }
    
    use potter::Potter;
    
    #[test]
    fn it_works() {
        let pot = Potter::new();
        assert_eq!(2 + 2, 4);
    }
    

    我删除了
    pub mod potter
    ,错误仍在继续。我应用了复制答案的解决方案,它似乎不起作用。我将我的potter.rs重命名为lib.rs,但它一直不起作用…我在
    测试/common.rs
    中执行此操作:
    #[macro_use]extern claiter mylib但是它说“外部板条箱
    加载宏必须位于板条箱根”。所以我想知道哪个文件是测试目录的“板条箱根目录”?有没有类似于src/lib.rs的文件?@Nawaz
    tests
    目录中的每个文件都被编译为一个单独的二进制文件箱。每一个都是板条箱的根。另见。那么为什么
    #[macro_使用]外部不适用于
    测试/common.rs
    ,它要求我放入一些
    板条箱根目录
    。板条箱根目录是什么,似乎没有明确定义。因为您没有将其放在板条箱根目录下。“板条箱根”是一个定义良好的术语-它是板条箱的入口点。tests目录中的每个文件都被编译为一个单独的二进制文件箱。这意味着您的
    tests/common.rs
    被编译为二进制文件,因此这是一个板条箱根(可能也不是您想要的)。假设您也将该文件作为模块从另一个文件导入,如
    tests/foo.rs
    -foo.rs也是一个板条箱根目录。我将所有内容从
    tests/common.rs
    移动到
    tests/common/mod.rs
    ,现在我可以执行
    mod common在其他测试文件中。它起作用了。谢谢你的帮助。