Вот наивная попытка использования #[cfg(test)]
в нескольких местах:
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);
}
}
Код основан на предоставленных вами фрагментах кода.Существует структура Registration
, которая содержит список имен учеников, два метода function_1
и function_2
для регистрации учеников и функция f
, которая выбирает между function_1
и function_2
в зависимости от количества учеников.are.
Во время тестов Registration
компилируется с дополнительной логической переменной function_1_called
.Эта переменная устанавливается, только если вызывается function_1
(блок кода, который делает это, также помечается #[cfg(test)]
).
В комбинации это делает дополнительный логический флаг доступным во время тестов, так чтоВы можете сделать утверждения, подобные следующему:
assert!(r.function_1_called);
Очевидно, что это может работать для структур, намного более сложных, чем один логический флаг (что вовсе не означает, что вы должны это делать).
Я не могу комментировать, является ли это идиоматическим в Rust или нет.Вся установка выглядит так, как будто она должна быть скрыта за причудливыми макросами, поэтому, если этот стиль тестирования вообще используется в Rust, уже должны быть ящики, которые предоставляют эти (или подобные) макросы.