Wdrożyłem następującą metodę i test jednostkowy:
use std::fs::File;
use std::path::Path;
use std::io::prelude::*;
fn read_file(path: &Path) {
let mut file = File::open(path).unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
println!("{}", contents);
}
#[test]
fn test_read_file() {
let path = &Path::new("/etc/hosts");
println!("{:?}", path);
read_file(path);
}
Test jednostkowy uruchamiam w ten sposób:
rustc --test app.rs; ./app
Mógłbym to również uruchomić
cargo test
Otrzymuję wiadomość z powrotem, że test przeszedł pomyślnie, ale println!
nigdy nie jest wyświetlany na ekranie. Dlaczego nie?
--nocapture
opcjicargo test
, ale ładunek nie rozpoznaje dla mnie tej flagi (korzystając z najnowszej nocy z rustup.sh). Jesteś pewien, że to powinno działać?cargo test -- --nocapture
, powinno działać.cargo test [--] --bench
do pracy!nocapture
, a nieno-capture
.TL; DR
Z następującym kodem:
Następnie uruchom następujące czynności:
I powinieneś zobaczyć
źródło
cargo test -- --no-capture
nie działa.thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
--nocapture
inna--no-capture
. Jest to jednak całkowicie oczywisty błąd, biorąc pod uwagę większość konwencji wiersza poleceń, z którymi zwykle się spotykamy. Właśnie użyłem tej opcji dokładnie tak, jak opisano w tej odpowiedzi w rdzeniu 1.1 (ładunek 0.2.0) i działała dokładnie tak, jak reklamowano.Aby dołączyć wydruki
println!()
i zachować kolory dla wyników testu, użyj flagcolor
i .nocapture
cargo test
(wersja cargo: 0.13.0 na noc)
źródło
Podczas testowania standardowe wyjście nie jest wyświetlane. Nie używać wiadomości tekstowych do testowania, ale
assert!
,assert_eq!
ifail!
zamiast tego. System testów jednostkowych Rust może zrozumieć te, ale nie SMS-y.Test, który napisałeś, przejdzie pomyślnie, nawet jeśli coś pójdzie nie tak. Zobaczmy, dlaczego:
read_to_end
podpis jestfn read_to_end(&mut self) -> IoResult<Vec<u8>>
Zwraca an,
IoResult
aby wskazać sukces lub błąd. Jest to po prostu def dla typu, dlaResult
którego wartością błędu jest anIoError
. To Ty decydujesz, jak rozwiązać błąd. W tym przypadku chcemy zadanie nie, co jest realizowane poprzez wywołanieunwrap
naResult
.To zadziała:
unwrap
nie należy jednak nadużywać.źródło