Как я могу проверить аргументы, которые программа Rust передает другой программе? - PullRequest
0 голосов
/ 06 сентября 2018

Я пишу тесты для инструмента командной строки, который позволяет вам указать пейджер. Я хочу проверить, что инструмент передает правильные аргументы. Я подумал, что напишу однострочный двоичный файл, который проверяет аргументы и завершает работу с ненулевым кодом состояния (плюс некоторый вывод 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
}

1 Ответ

0 голосов
/ 06 сентября 2018

Сделайте ваш тестовый двоичный файл новым проектом Cargo в src, а затем укажите его в ваших основных проектах как зависимость dev, используя относительный путь.

[dev-dependencies] test_binary = { path = "src/test_binary", version = "0.1" }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...