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>whereE: std::fmt::Debug,{fn assert_ok_matches<F>(self, matcher: F)whereF: 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.