J'ai implémenté la méthode et le test unitaire suivants:
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);
}
Je lance le test unitaire de cette façon:
rustc --test app.rs; ./app
Je pourrais aussi faire ça avec
cargo test
Je reçois un message disant que le test a réussi, mais il println!
ne s'affiche jamais à l'écran. Pourquoi pas?
--nocapture
option àcargo test
, mais cargo ne reconnaît pas ce drapeau pour moi (en utilisant la dernière nuit de rustup.sh). Êtes-vous sûr que cela devrait fonctionner?cargo test -- --nocapture
, cela devrait fonctionner.cargo test [--] --bench
au travail aussi!nocapture
, nonno-capture
.TL; DR
Avec le code suivant:
Exécutez ensuite ce qui suit:
Et tu devrais voir
la source
cargo test -- --no-capture
ne fonctionne plus.thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
--nocapture
pas--no-capture
. Cependant, c'est une erreur tout à fait évidente à faire étant donné la plupart des conventions de ligne de commande que nous avons tendance à rencontrer. J'ai juste utilisé cette option exactement comme décrit dans cette réponse dans rust 1.1 (cargo 0.2.0) et cela a fonctionné exactement comme annoncé.Pour inclure les impressions avec
println!()
et conserver les couleurs des résultats du test, utilisez les drapeauxcolor
et .nocapture
cargo test
(version cargo: 0.13.0 la nuit)
la source
Pendant le test, la sortie standard n'est pas affichée. Ne pas utiliser des messages texte pour tester mais
assert!
,assert_eq!
et aufail!
lieu. Le système de test unitaire de Rust peut comprendre ces messages, mais pas les SMS.Le test que vous avez écrit passera même si quelque chose ne va pas. Voyons pourquoi:
read_to_end
la signature defn read_to_end(&mut self) -> IoResult<Vec<u8>>
Il renvoie un
IoResult
pour indiquer le succès ou l'erreur. Il s'agit simplement d'un type def pour unResult
dont la valeur d'erreur est unIoError
. C'est à vous de décider comment traiter une erreur. Dans ce cas, nous voulons que la tâche échoue, ce qui se fait en appelantunwrap
leResult
.Cela fonctionnera:
unwrap
ne doit cependant pas être surutilisé.la source