He implementado el siguiente método y prueba unitaria:
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);
}
Ejecuto la prueba de la unidad de esta manera:
rustc --test app.rs; ./app
También podría ejecutar esto con
cargo test
Recibo un mensaje que dice que la prueba pasó pero println!
que nunca se muestra en la pantalla. Por qué no?
--nocapture
opción acargo test
, pero la carga no reconoce esta bandera para mí (usando la última noche de rustup.sh). ¿Estás seguro de que debería funcionar?cargo test -- --nocapture
, debería funcionar.cargo test [--] --bench
al trabajo también!nocapture
, nono-capture
.TL; DR
Con el siguiente código:
Luego ejecute lo siguiente:
Y deberías ver
fuente
cargo test -- --no-capture
Ya no funciona. Me sale el siguiente error:thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
--nocapture
no--no-capture
. Sin embargo, es un error completamente obvio cometer la mayoría de las convenciones de línea de comandos que tendemos a encontrar. Acabo de utilizar esta opción exactamente como se describe en esta respuesta en rust 1.1 (carga 0.2.0) y funcionó exactamente como se anuncia.Para incluir impresiones con
println!()
y mantener colores para los resultados de la prueba, use las banderascolor
y .nocapture
cargo test
(versión de carga: 0.13.0 por noche)
fuente
Durante la prueba, no se muestra la salida estándar. No utilizar mensajes de texto para probar, pero
assert!
,assert_eq!
yfail!
en su lugar. El sistema de prueba de la unidad de Rust puede entender esto pero no mensajes de texto.La prueba que ha escrito pasará incluso si algo sale mal. Veamos por qué:
read_to_end
la firma esfn read_to_end(&mut self) -> IoResult<Vec<u8>>
Devuelve un
IoResult
para indicar éxito o error. Esto es solo un tipo def para unResult
cuyo valor de error es unIoError
. Depende de usted decidir cómo se debe manejar un error. En este caso, queremos que la tarea falle, lo que se hace llamandounwrap
alResult
.Esto funcionará:
unwrap
Sin embargo, no se debe usar en exceso.fuente