Я пишу тесты для инструмента командной строки, который позволяет вам указать пейджер. Я хочу проверить, что инструмент передает правильные аргументы. Я подумал, что напишу однострочный двоичный файл, который проверяет аргументы и завершает работу с ненулевым кодом состояния (плюс некоторый вывод STDERR), если они не правы, а затем помещает тест под tests/
, который запускает этот двоичный файл и проверяет его вывод, который я могу запустить как обычно, используя cargo test
. Эта настройка работает, если я помещаю бинарный файл в src/bin
, но тогда тестовый бинарный файл также устанавливается при использовании cargo install
.
Когда я поместил файл .rs
для двоичного файла в tests/
, он просто не был скомпилирован в двоичный файл.
Я попытался поместить его в ящик в том же рабочем пространстве, но потом он не был собран при запуске cargo build
в корневом ящике ... если только я не укажу его как элемент по умолчанию, в этом случае мы вернемся к его установке при использовании cargo install
.
Например, приведенный код выглядит так:
use std::process::Command;
fn run_pager(pager: &str) {
let output = Command::new(&pager)
.env("SOME_VAR", "FOO")
.spawn()
.expect("failed to run pager");
// do something with the command
}
И заглушка test-binary.rs
, которая выглядит так:
use std::env;
fn main() {
assert_eq!(env::var("SOME_VAR").unwrap(), "FOO");
// …produce output with special markers…
}
Как мне написать tests/passes-correct-args.rs
:
#[test]
fn runs_pager_with_args() {
// pass `test-binary` to `run_pager` and verify output
}