2 minutes
Testing Dart Exceptions & Errors
Beim Unit Testing sollte man auch die (bekannten) Ausnahmesituationen testen, z.B. wenn Parameter einer Methode in einem Wertebereich liegen müssen, der Aufrufer aber Werte ausserhalb desselben übergeben kann.
Beispiel mit Dart
In Dart habe ich ein Modell namens WeeklyInterval
entworfen, das eine Map
für die Wochentage und ihren Status (true/false
) enthält. Mit der Methode set(int day, bool value)
kann der Aufrufer bestimmen, ob der Wochentag wiederholt werden soll oder nicht.
class WeeklyInterval extends Interval {
Map<int, bool> days = {
DateTime.monday: false,
DateTime.tuesday: false,
DateTime.wednesday: false,
DateTime.thursday: false,
DateTime.friday: false,
DateTime.saturday: false,
DateTime.sunday: false
};
WeeklyInterval();
void set(int day, bool value) {
assert(DateTime.monday <= day && day <= DateTime.sunday);
this.days[day] = value;
}
}
Mittels assert
kann ich zur Laufzeit angeben, ob der Wertebereich für den Parameter day
verletzt wird.
Unit test
Diese Fall möchte ich auch explizit testen. Dafür verwende ich folgenden Unit Test:
[...]
test("Set an incorrect date", () {
WeeklyInterval interval = WeeklyInterval();
expect(() => interval.set(8, true), throwsAssertionError);
});
[...]
Mit () => interval.set(8, true)
weise ich expect
an, diese Funktion mit einem Parameter ausserhalb des erwarteten Wertbereichs aufzurufen. Mit dem Matcher throwsAssertError gebe ich an, das expect
einen entsprechenden Fehler erwartet. Tritt dieser Fehler nicht auf, dann schlägt expect und damit der Test fehl.
Mit throwsA(TypeMatcher<your-exception-here>)
kann expect
prüfen, ob bestimmte Ausnahmen geworfen werden.
Update
throwsA
is seit Flutter Version 1.12.1 deprecated. Nunmehr kann man mit dem Ausdruck throwsA(isA<your-exception>())
prüfen, ob your-exception
geworfen wurde.