Множественная паника в одном тесте без дублирования кода

#rust

#Ржавчина

Вопрос:

Я хочу протестировать несколько паник, но это приводит к дублированию кода

например.

 #[test]
fn test_without_panic() {
    CODEBLOCK1
}

#[test]
#[should_panic(expected = "It will panic1")]
fn test_with_panic1() {
    CODEBLOCK1
    CODEBLOCK2

}

#[test]
#[should_panic(expected = "It will panic2")] 
fn test_with_panic2() {
    CODEBLOCK1
    CODEBLOCK3
}
  

Каков наилучший способ тестирования паники без повторения кода.

Комментарии:

1. Да, изменил вопрос. @trentcl

2. Я думаю написать функцию для CODEBLOCK1, это правильный путь?

Ответ №1:

Да, напишите вспомогательную функцию и передайте значения из нее, если вам нужно.

 fn setup() -> (Things, Tests, Need) {
    CODEBLOCK1
    (stuff, from, codeblock1)
}

#[test]
fn test_setup_succeeds() {
    setup();
}

#[test]
#[should_panic(expected = "It will panic1")]
fn test_with_panic1() {
    let (a, b, c) = setup();
    CODEBLOCK2

}

#[test]
#[should_panic(expected = "It will panic2")] 
fn test_with_panic2() {
    let (a, b, c) = setup();
    CODEBLOCK3
}
  

Преимущество этого по сравнению с организацией записи всего вышеперечисленного в одной тестовой функции (с которой, я полагаю, вы могли catch_unwind бы справиться) заключается в том, что каждый тест может быть успешным или неудачным независимо, что означает, что если ваши тесты завершатся неудачей, вы получите больше информации о проблеме, чем если бы первая паника или отсутствиепаника остановила тест.