Флаттер: проверить, что выбрасывается конкретное исключение
Короче , 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>()));