2012-11-08 4 views
10

Betrachten Sie eine Funktion, die eine Ausnahmebehandlung auf die Argumente übergeben basiert tut:Wie kombinierst du Ausnahmen in Dart?

List range(start, stop) { 
    if (start >= stop) { 
     throw new ArgumentError("start must be less than stop"); 
    } 
    // remainder of function 
} 

Wie teste ich, dass die richtige Art von Ausnahme ausgelöst wird?

Antwort

23

In diesem Fall gibt es verschiedene Möglichkeiten, die Ausnahme zu testen. Um einfach zu testen, ob eine Ausnahme ausgelöst:

expect(() => range(5, 5), throws); 

zu testen, dass die richtige Art von Ausnahme ausgelöst wird:

expect(() => range(5, 2), throwsA(new isInstanceOf<ArgumentError>())); 

, um sicherzustellen, dass keine Ausnahme ausgelöst wird:

expect(() => range(5, 10), returnsNormally); 

zu Testen Sie den Ausnahmetyp und die Ausnahmemeldung:

expect(() => range(5, 3), 
    throwsA(predicate((e) => e is ArgumentError && e.message == 'start must be less than stop'))); 

hier ist ein weiterer Weg, dies zu tun:

expect(() => range(5, 3), 
    throwsA(allOf(isArgumentError, predicate((e) => e.message == 'start must be less than stop')))); 

(Dank Graham Wheeler bei Google für die letzten 2 Lösungen).

+0

I 'erwarten tat (Bereich (5, 3), throwsArgumentError) ', aber die Ausnahme wurde nicht innerhalb des Expect eingefangen. Das erste zu erwartende Argument muss eine anonyme Funktion sein, die beim Aufruf schließlich geworfen wird. Deine Antwort hat mir geholfen, diesen blöden Fehler zu finden, danke! – fgiraldeau

2

Ich mag diesen Ansatz:

test('when start > stop',() { 
    try { 
    range(5, 3); 
    } on ArgumentError catch(e) { 
    expect(e.message, 'start must be less than stop'); 
    return; 
    } 
    throw new ExpectException("Expected ArgumentError"); 
}); 
+0

Es ist ein wenig ausführlicher als die anderen Optionen, aber es ist ziemlich lesbar, und es geht nicht davon aus, dass Sie die gesamte Unittest-Bibliothek gespeichert haben;) –

1

Für einfache Ausnahme Tests, ziehe ich die statische Methode API zu verwenden:

Expect.throws(
    // test condition 
(){ 
    throw new Exception('code I expect to throw'); 
    }, 
    // exception object inspection 
    (err) => err is Exception 
);