Флаттер: проверить, что выбрасывается конкретное исключение

Короче , throwsA(anything) мне не хватает пока юнит тестирования в дротике. Как проверить конкретное сообщение об ошибке или тип?

Вот ошибка, которую я хотел бы уловить:

class MyCustErr implements Exception {
  String term;

  String errMsg() => 'You have already added a container with the id 
  $term. Duplicates are not allowed';

  MyCustErr({this.term});
}

вот текущее утверждение, которое проходит, но хотел бы проверить тип ошибки выше:

expect(() => operations.lookupOrderDetails(), throwsA(anything));

Вот что я хочу сделать:

expect(() => operations.lookupOrderDetails(), throwsA(MyCustErr));

6 ответов

Решение

Это должно делать то, что вы хотите:

expect(() => operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));

expect(() => operations.lookupOrderDetails(), isInstanceOf<MyCustErr>()));

По состоянию на апрель 2021 года это правильный метод.

ПРАВИЛЬНЫЙ МЕТОД

      import 'package:dcli/dcli.dart';
import 'package:test/test.dart';

 /// GOOD: works in all circumstances.
 expect(() => restoreFile(file), throwsA(isA<RestoreFileException>()));

Некоторые примеры показывают:

НЕПРАВИЛЬНЫЙ МЕТОД

      import 'package:dcli/dcli.dart';
import 'package:test/test.dart';
 /// BAD: works but not in all circumstances
 expect(restoreFile(file), throwsA(isA<RestoreFileException>()));

Обратите внимание на отсутствующий '() =>' после ожидаемого.

Разница в том, что первый метод будет работать для функций, возвращающих void, а второй - нет.

Таким образом, первый метод должен быть предпочтительным.

Чтобы проверить конкретное сообщение об ошибке:

ПРОВЕРЬТЕ СОДЕРЖАНИЕ ИСКЛЮЧЕНИЯ ТАКЖЕ

      import 'package:dcli/dcli.dart';
import 'package:test/test.dart';

    expect(
        () => copy(from, to),
        throwsA(predicate((e) =>
            e is CopyException &&
            e.message == 'The from file ${truepath(from)} does not exists.')));

После того, как TypeMatcher<> устарел во Flutter 1.12.1, я обнаружил, что это работает:

expect(() => operations.lookupOrderDetails(), throwsA(isInstanceOf<MyCustErr>()));

В случае, если кто-то хочет протестировать с помощью асинхронной функции, как я, все, что вам нужно сделать, это добавить async ключевое слово в ожидании, учитывая, что lookupOrderDetails это асинхронная функция:

expect(() **async** => **await** operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));

expect(() **async** => **await** operations.lookupOrderDetails(), isInstanceOf<MyCustErr>()));

Он по-прежнему использует ответ Гюнтера, что очень хорошо!

Текущий правильный способ ожидать, что вызов функции вызовет исключение:

      expect(operations.lookupOrderDetails, throwsA(isA<MyCustErr>()));`

Сначала импортируйте правильный пакет 'package: matcher / matcher.dart';

expect(() => yourOperation.yourMethod(),
      throwsA(const TypeMatcher<YourException>()));
Другие вопросы по тегам