Я реализовал следующий метод и модульный тест:
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);
}
Я запускаю модульное тестирование следующим образом:
rustc --test app.rs; ./app
Я мог бы также запустить это с
cargo test
Я получаю сообщение о том, что тест пройден, но println!
никогда не отображается на экране. Почему нет?
--nocapture
опциюcargo test
, но Cargo не распознает этот флаг для меня (используется последняя ночная версия от rustup.sh). Вы уверены, что это должно работать?cargo test -- --nocapture
, это должно работать.cargo test [--] --bench
до работы тоже!nocapture
, нетno-capture
.TL; DR
С помощью следующего кода:
Затем выполните следующее:
И вы должны увидеть
источник
cargo test -- --no-capture
больше не работает. Я получаю следующую ошибку:thread '<main>' panicked at '"Unrecognized option: \'no-capture\'."', ../src/libtest/lib.rs:249
--nocapture
, нет--no-capture
. Тем не менее, это совершенно очевидная ошибка, если принять во внимание большинство соглашений командной строки, с которыми мы обычно сталкиваемся. Я просто использовал эту опцию точно так, как описано в этом ответе в ржавчине 1.1 (груз 0.2.0), и она работала именно так, как рекламируется.Чтобы включить распечатки
println!()
и сохранить цвета для результатов теста, используйте флагиcolor
и .nocapture
cargo test
(грузовая версия: 0.13.0 ночью)
источник
Во время тестирования стандартный вывод не отображается. Не используйте текстовые сообщения для тестирования , но
assert!
,assert_eq!
иfail!
вместо этого. Система модульного тестирования Rust может понимать эти, но не текстовые сообщения.Тест, который вы написали, пройдет, даже если что-то пойдет не так. Посмотрим почему:
read_to_end
подписьfn read_to_end(&mut self) -> IoResult<Vec<u8>>
Возвращает,
IoResult
чтобы указать успех или ошибку. Это просто тип def дляResult
значения ошибки которого являетсяIoError
. Вам решать, как обрабатывать ошибку. В этом случае, мы хотим , чтобы задача потерпеть неудачу, что делается путем вызоваunwrap
наResult
.Это будет работать:
unwrap
не следует злоупотреблять, хотя.источник