Implementei o seguinte método e teste de unidade:
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);
}
Eu executo o teste de unidade desta maneira:
rustc --test app.rs; ./app
Eu também poderia executar isso com
cargo test
Recebo uma mensagem dizendo que o teste foi aprovado, mas que println!
nunca é exibido na tela. Por que não?
--nocapture
opção paracargo test
, mas a carga não reconhece essa sinalização para mim (usando as últimas noites do rustup.sh). Tem certeza de que deve funcionar?cargo test -- --nocapture
, deve funcionar.cargo test [--] --bench
trabalhar também!nocapture
, nãono-capture
.TL; DR
Com o seguinte código:
Em seguida, execute o seguinte:
E você deveria ver
fonte
cargo test -- --no-capture
não funciona mais. Eu recebo o seguinte erro:thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
--nocapture
não--no-capture
. No entanto, é um erro completamente óbvio cometer a maioria das convenções de linha de comando que tendemos a encontrar. Eu apenas usei essa opção exatamente como descrito nesta resposta na ferrugem 1.1 (carga 0.2.0) e funcionou exatamente como anunciado.Para incluir impressões
println!()
e manter cores nos resultados do teste, use os sinalizadorescolor
e .nocapture
cargo test
(versão cargo: 0.13.0 noturno)
fonte
Durante o teste, a saída padrão não é exibida. Não use mensagens de texto para testar, mas
assert!
,assert_eq!
efail!
em vez disso. O sistema de teste de unidade da Rust pode entender essas, mas não as mensagens de texto.O teste que você escreveu será aprovado mesmo que algo dê errado. Vamos ver o porquê:
read_to_end
A assinatura defn read_to_end(&mut self) -> IoResult<Vec<u8>>
Retorna um
IoResult
para indicar sucesso ou erro. Este é apenas um tipo def para umResult
cujo valor de erro é umIoError
. Cabe a você decidir como um erro deve ser tratado. Nesse caso, queremos que a tarefa falhe, o que é feito chamandounwrap
oResult
.Isso funcionará:
unwrap
não deve ser usado em excesso.fonte