Как вы исключаете исключения из Дарта?
Рассмотрим функцию, которая выполняет некоторую обработку исключений на основе переданных аргументов:
List range(start, stop) {
if (start >= stop) {
throw new ArgumentError("start must be less than stop");
}
// remainder of function
}
Как проверить, что возникает правильный тип исключения?
Ответы
Ответ 1
В этом случае существуют различные способы проверки исключения. Чтобы просто проверить, что возникает исключение:
expect(() => range(5, 5), throws);
чтобы проверить, что возникает правильный тип исключения:
expect(() => range(5, 2), throwsA(new isInstanceOf<ArgumentError>()));
чтобы исключить исключение:
expect(() => range(5, 10), returnsNormally);
чтобы проверить тип исключения и сообщение об ошибке:
expect(() => range(5, 3),
throwsA(predicate((e) => e is ArgumentError && e.message == 'start must be less than stop')));
вот еще один способ сделать это:
expect(() => range(5, 3),
throwsA(allOf(isArgumentError, predicate((e) => e.message == 'start must be less than stop'))));
(Спасибо Грэму Уилеру в Google за последние 2 решения).
Ответ 2
Мне нравится этот подход:
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");
});
Ответ 3
Для простого тестирования исключений я предпочитаю использовать API статического метода:
Expect.throws(
// test condition
(){
throw new Exception('code I expect to throw');
},
// exception object inspection
(err) => err is Exception
);