Как вы исключаете исключения из Дарта?

Рассмотрим функцию, которая выполняет некоторую обработку исключений на основе переданных аргументов:

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
);