如何在 Rust 的 Cargo 集成测试中访问二进制函数

3
在我的货物项目中,我定义了两个二进制目标。如何从集成测试中访问在二进制文件中定义的函数?
[package]
name = "passman"
version = "0.1.0"
edition = "2018"

[[bin]]
name = "passmand"
path = "src/daemon/main.rs"

[[bin]]
name = "passman"
path = "src/cli/main.rs"

.
├── Cargo.lock
├── Cargo.toml
├── README.md
├── src
│   ├── cli
│   │   ├── argument
│   │   │   └── mod.rs
│   │   └── main.rs
│   └── daemon
│       ├── entry_value.rs
│       ├── main.rs
│       ├── passman_crypto.rs
│       ├── passman.service
│       └── password_file.rs   <- i want to access functions defined in this
└── tests
    ├── password_file_tests.rs   <- this is my integration test
    └── test.py

我尝试使用extern crate passmand;访问文件,但Cargo只是抱怨:
 --> tests/password_file_tests.rs:6:1
  |
6 | extern crate passmand;
  | ^^^^^^^^^^^^^^^^^^^^^^ can't find crate

passmand不是一个crate,它是你的crate中的一个二进制文件。此外,你无论如何都不能将仅限于二进制的crate用作库。 - undefined
谢谢你的评论,@mcarton。我明白你在说什么,但这并没有帮助到我。你有看到解决方案吗? - undefined
你需要在你的 crate 中添加一个 [lib] 部分,并在那里定义常用函数。 - undefined
@mcarton 你说的是"crate",当你指的是"package"时。passmand 一个 crate,但它是一个二进制 crate,所以不能使用 extern crate 导入。 - undefined
2个回答

4
在我的情况下,以下代码可解决问题。
#[path = "../src/bin/some_bin.rs"]
mod some_bin;

use some_bin::XXX;

#[test]
fn func_test() {
// ...
}

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - undefined

3

集成测试是用于测试库而不是二进制文件。您可以通过为箱创建一个库目标来公开要测试的函数。但是,如果您不希望人们将其用作库,则最好在项目的src目录中编写单元测试。 在Rust中,在与它们进行测试的代码相同的文件中编写单元测试是最常见和惯用的方式。

如果您实际上想测试二进制文件-例如确保CLI界面按预期工作-则可以将其作为二进制文件运行。也许有一种更可靠的获取二进制文件路径的方法(欢迎编辑!),但这应该有效。

use std::process::Command;
use std::path::PathBuf;

#[test]
fn test_cli() {
    let mut path = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
    path.push("target/debug/passman");
    let output = Command::new(path)
        .arg("--an-arg")
        .output()
        .expect("Failed to execute command");

    assert_eq!(&output.stdout[..], b"Hello, world!\n");
}

还有一个CARGO_TARGET_DIR变量,可能会使代码更清晰。 - undefined
1
可以通过 env!("CARGO_BIN_EXE_<name>") 找到测试期间正在编译的二进制文件路径。详见:https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接