Voici une tentative naïve utilisant #[cfg(test)]
à plusieurs endroits :
struct Registration {
students: Vec<String>,
#[cfg(test)]
function_1_called: bool,
}
impl Registration {
fn new() -> Self {
Registration {
students: Vec::new(),
#[cfg(test)]
function_1_called: false,
}
}
fn function_1(&mut self, students: Vec<String>) {
self.students.extend(students);
#[cfg(test)]
{
self.function_1_called = true;
}
}
fn function_2(&mut self, students: Vec<String>) {}
fn f(&mut self, students: Vec<String>) {
if students.len() < 100 {
self.function_1(students);
} else {
self.function_2(students);
}
}
}
fn main() {
println!("Hello, world!");
let r = Registration::new();
// won't compile during `run`:
// println!("{}", r.function_1_called);
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_f() {
let mut r = Registration::new();
r.function_1(vec!["Alice".to_string(), "Bob".to_string()]);
assert!(r.function_1_called);
}
}
Le code est vaguement basé sur les extraits que vous avez fournis. Il y a un Registration
qui contient une liste de noms d'élèves, deux méthodes function_1
y function_2
pour l'inscription des étudiants, et une fonction f
qui choisit entre function_1
y function_2
en fonction du nombre d'étudiants.
Pendant les tests, Registration
est compilé avec une variable booléenne supplémentaire function_1_called
. Cette variable n'est définie que si function_1
est appelé (le bloc de code qui le fait est également marqué par le symbole #[cfg(test)]
).
En combinaison, cela rend un drapeau booléen supplémentaire disponible pendant les tests, de sorte que vous pouvez faire des assertions comme celle qui suit :
assert!(r.function_1_called);
Évidemment, cela pourrait fonctionner pour des structures beaucoup plus compliquées qu'un simple drapeau booléen (ce qui ne signifie pas du tout que vous devriez le faire).
Je ne peux pas dire si cela est idiomatique dans Rust ou non. Toute la configuration semble devoir être cachée derrière des macros fantaisistes, donc si ce style de test est utilisé dans Rust, il devrait déjà y avoir des crates qui fournissent ces macros (ou des macros similaires).