Тест на ожидаемую остановку в Rust
В разделе про модули мы уже писали блок
#[cfg(test)] и функции с #[test].
Там успех - это когда проверки совпали.
Иногда нужно убедиться, что код намеренно
прерывает выполнение: для этого функцию
теста помечают отдельным атрибутом.
Атрибут говорит сборщику тестов: если внутри произошла паника, прогон этой функции считается удачным. Без такой метки остановка означала бы провал теста.
Запишем функцию, которая останавливается при нуле, и тест, который ждет эту остановку:
fn reject_zero(n: i32) {
if n == 0 {
panic!("zero");
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[should_panic]
fn zero_stops() {
reject_zero(0);
}
}
fn main() {
reject_zero(1);
println!("ok");
}
Обычный запуск программы дойдет до печати
"ok". Команда из корня проекта
проверит только блок тестов, и zero_stops
должна попасть в пройденные, потому что
остановка внутри была ожидаемой:
cargo test
Дана функция:
fn must_positive(n: i32) {
if n < 0 {
panic!("negative");
}
}
Добавьте блок тестов с одной проверкой,
которая ждет остановку при отрицательном
аргументе, и запустите cargo test.
Дан следующий код:
#[cfg(test)]
mod tests {
#[test]
fn passes() {
assert_eq!(1 + 1, 2);
}
}
Добавьте второй тест без атрибута ожидания
остановки, внутри вызовите команду
с текстом "fail", и скажите,
пройдет ли cargo test.
Объясните, чем тест с ожиданием остановки
отличается от обычного #[test],
где внутри стоит assert_eq!.