2012-11-08 15 views
10

Rozważmy to funkcja, która ma pewną obsługę wyjątków w oparciu o argumenty przekazywane:Jak odblokować wyjątki w Dart?

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

Jak mogę sprawdzić, czy odpowiedni rodzaj jest wyjątek?

Odpowiedz

23

W tym przypadku istnieją różne sposoby testowania wyjątku. Po prostu sprawdzić, że jest wyjątek:

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

przetestować że odpowiedni rodzaj jest wyjątek:

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

aby upewnić się, że nie jest wyjątek:

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

do Przetestuj typ wyjątku i wyjątek:

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

tutaj jest kolejnym sposobem, aby to zrobić:

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

(Dzięki Graham Wheeler w Google przez ostatnie 2 rozwiązań).

+0

robiłem 'spodziewać (zakres (5, 3), throwsArgumentError) ', ale wyjątek nie spełnił oczekiwań. Pierwszym argumentem, którego należy się spodziewać, musi być anonimowa funkcja, która zostanie ostatecznie wywołana po wywołaniu. Twoja odpowiedź pomogła mi znaleźć ten głupi błąd, dzięki! – fgiraldeau

2

Lubię to podejście:

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

To jest trochę więcej gadżetu niż inne opcje, ale jest dość czytelne i nie zakłada, że ​​masz zapamiętaną całą bibliotekę z uprawnieniami;) –

1

dla prostych testów wyjątków, wolę użyć statycznej metody API:

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