gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:55:56 26 4
gpt4 key购买 nike

我正在尝试在 Rust 中配置一个示例项目以使其工作。

我的结构是:

  • src/potter.rs
  • tests/tests.rs

还有我的Cargo.toml

[package]
name = "potter"
version = "0.1.0"
authors = ["my name"]
[dependencies]

我的 potter.rs 包含:

pub mod potter {
pub struct Potter {

}

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

}

我的 tests.rs 包含:

use potter::Potter;

#[test]
fn it_works() {

let pot = potter::Potter::new();
assert_eq!(2 + 2, 4);
}

但是我收到这个错误:

error[E0432]: unresolved import `potter`
--> tests/tests.rs:1:5
|
1 | use potter::Potter;
| ^^^^^^ Maybe a missing `extern crate potter;`?

error[E0433]: failed to resolve. Use of undeclared type or module `potter`
--> tests/tests.rs:6:19
|
6 | let pot = potter::Potter::new();
| ^^^^^^ Use of undeclared type or module `potter`

warning: unused import: `potter::Potter`
--> tests/tests.rs:1:5
|
1 | use potter::Potter;
| ^^^^^^^^^^^^^^
|
= note: #[warn(unused_imports)] on by default

如果我添加 extern crate potter;,它不会解决任何问题...

error[E0463]: can't find crate for `potter`
--> tests/tests.rs:1:1
|
1 | extern crate potter;
| ^^^^^^^^^^^^^^^^^^^^ can't find crate

最佳答案

回去reread The Rust Programming Language about packages, crates, modules and the filesystem .

常见痛点:

  • 每种编程语言都有自己处理文件的方式 — 您不能仅仅假设因为您使用过任何其他语言就可以神奇地获得 Rust 的处理方式。这就是为什么你应该 go back and re-read the book chapter on it .

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

  • 你的库包的根必须lib.rs;二进制包可以使用 main.rs

  • 不,您真的不应该尝试进行非惯用的文件系统组织。有一些技巧可以做你想做的大部分事情;这些都是糟糕的想法,除非你已经是高级 Rust 用户。

  • 地道的 Rust 通常不会像许多其他语言那样放置“每个文件一种类型”。对真的。您可以在一个文件中包含多个内容。

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

  • 集成测试、示例、基准测试都必须像 crate 的任何其他用户一样导入 crate,并且只能使用公共(public) API。


要解决您的问题:

  1. 将您的 src/potter.rs 移动到 src/lib.rs
  2. src/lib.rs 中删除 pub mod potter。不是严格必需的,但删除了不必要的模块嵌套。
  3. extern crate potter 添加到您的集成测试 tests/tests.rs(仅当您使用 Rust 2015 时才需要)。

文件系统

├── Cargo.lock
├── Cargo.toml
├── src
│   └── lib.rs
├── target
└── tests
└── tests.rs

src/lib.rs

pub struct Potter {}

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

测试/测试.rs

use potter::Potter;

#[test]
fn it_works() {
let pot = Potter::new();
assert_eq!(2 + 2, 4);
}

关于rust - 无法在集成测试中导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com