Как я могу проверить аргументы, которые программа на Rust передает другой программе?

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

Вам абсолютно необходимо, чтобы программа Rust вызывалась для проверки входных данных, или достаточно простого скрипта (bash / python)?

Matthieu M. 06.09.2018 16:01

Это не метод с отступом для тестов tests/. Пожалуйста, просмотрите ссылки, которые я предоставил. «Тесты в ваших файлах src должны быть модульными, а тесты в tests / должны быть тестами в стиле интеграции.»

hellow 06.09.2018 16:05

@MatthieuM., Если он портативный, я могу использовать что угодно. Он должен работать в Windows, Linux и OS X, о которых я знаю. Однако я бы не стал добавлять внешнюю зависимость вроде Python - это много для одного теста. Я полагал, что Rust - единственное, что есть у пользователя.

Aankhen 06.09.2018 16:08

@hellow, не могли бы вы объяснить, почему это неверно и какой будет правильный метод?

Aankhen 06.09.2018 16:11

@hellow: Разве это не проверка работы вызова другой программы точно интеграционным тестом?

Matthieu M. 06.09.2018 16:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
650
1

Ответы 1

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

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

Это звучит многообещающе, но если я сделаю это бинарным ящиком, то этот бинарный файл никогда не будет собран во время компиляции или тестирования основного ящика, а с библиотечным ящиком я получаю только файл .d в target/debug/. Есть ли способ обойти это?

Aankhen 06.09.2018 23:45

Сохраните бинарный ящик, но добавьте к нему файл lib.rs. Он строится сейчас?

hwiechers 07.09.2018 06:52

Похоже, это невозможно github.com/rust-lang/cargo/issues/2267. Я думаю, вы могли бы попробовать вызвать компилятор из своих тестов.

hwiechers 07.09.2018 07:22

Blast ... Я надеялся избежать этого, так как я ничего не знаю о компиляторе, но, думаю, у меня нет выбора в этом случае. (Я пробовал добавить lib.rs в бинарный ящик, прежде чем комментировать. Он просто игнорирует бинарный файл.)

Aankhen 07.09.2018 08:00

Другие вопросы по теме