0 Tage Serie
rust / expert
Snippet

Parametrisierung von Unit-Tests durch generische Assertion-Traits

Durch die Implementierung eines benutzerdefinierten Extension-Traits für Result können wir generische, wiederverwendbare und typparametrisierte Assertions innerhalb unserer Unit-Tests definieren und das Test-Harness von manuellen Match-Assertions entkoppeln.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
trait AssertResultExt<T, E> {
fn assert_ok_matches<F>(self, matcher: F) where F: FnOnce(T);
}
impl<T, E> AssertResultExt<T, E> for Result<T, E>
where
E: std::fmt::Debug,
{
fn assert_ok_matches<F>(self, matcher: F)
where
F: FnOnce(T),
{
match self {
Ok(value) => matcher(value),
Err(err) => panic!("Expected Ok, but got Err: {:?}", err),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
fn get_even_number(x: i32) -> Result<i32, String> {
if x % 2 == 0 {
Ok(x)
} else {
Err("Not even".to_string())
}
}
#[test]
fn test_even_logic() {
let result = get_even_number(42);
result.assert_ok_matches(|val| {
assert!(val > 40);
assert_eq!(val, 42);
});
}
}
Erklärung
1
trait AssertResultExt<T, E>
Deklariert ein Trait, um Standard-Result-Typen mit speziellen Test-Assertion-Funktionen zu erweitern.
2
fn assert_ok_matches<F>(self, matcher: F)
Empfängt einen Closure, der benutzerdefinierte Assertions auf dem erfolgreich entpackten inneren Wert ausführt.
3
panic!("Expected Ok, but got Err: {:?}", err)
Standardmäßiges Panic-Verhalten bei unerwartetem Ergebnis, um Testprotokolle sauber zu halten.
4
result.assert_ok_matches(|val| { ... })
Evaluiert die Assertions innerhalb des Callbacks und validiert die Logik der getesteten Funktion.