Dart Unit Test

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.

Referenzen