Pertanyaan Membuat `std :: env :: Args` iterator untuk pengujian


Apakah ada cara di Rust untuk membuat std::env::Args dari Vec<String> untuk menggunakannya dalam #[test] fungsi?

Saya ingin menguji fungsi yang mendapat std::env::Args sebagai argumen, tetapi saya tidak tahu cara membuat objek seperti itu dengan daftar argumen yang saya berikan untuk pengujian.

Saya tidak dapat mengetahui yang ini dari dokumen, sumber, atau dari penelusuran Google.


4
2017-11-22 18:05


asal


Jawaban:


Bidang-bidang std::env::Args tidak didokumentasikan, dan tampaknya tidak ada fungsi publik untuk membuatnya dengan bidang khusus. Jadi, Anda tidak beruntung di sana.

Tapi karena itu hanya "Sebuah iterator atas argumen suatu proses, menghasilkan a String nilai untuk setiap argumen"fungsi Anda dapat mengambil String iterator atau Vec tanpa kehilangan fungsi atau jenis keamanan. Karena itu hanya daftar Strings, tidak masuk akal untuk membatasi fungsi Anda ke string yang kebetulan berasal dari baris perintah.

Melihat melalui Tes karat sendiri, itulah yang mereka lakukan. Ada banyak sekali let args: Vec<String> = env::args().collect();

Bahkan ada sebuah contoh di rustbuild di mana mereka menanggalkan nama program dan hanya memberi makan daftar argumen.

use std::env;

use bootstrap::{Config, Build};

fn main() {
    let args = env::args().skip(1).collect::<Vec<_>>();
    let config = Config::parse(&args);
    Build::new(config).build();
}

Dan bootstrap::Config::parse() terlihat seperti ini:

impl Config {
    pub fn parse(args: &[String]) -> Config {
        let flags = Flags::parse(&args);
        ...

Saya bukan ahli Rust, tetapi tampaknya itulah cara orang-orang Rust menangani masalah.


6
2017-11-22 18:34