Как проверить исключения, генерируемые из генератора asyn c? - PullRequest
1 голос
/ 12 апреля 2020

В моем приложении Flutter есть класс репозиторий со следующим методом, который возвращает поток:

Stream<List<Product>> getProducts() async* {
  var currentUser = await this._auth.currentUser();

  if (currentUser == null) {
    throw AuthException('not_logged_in',
        'No current user found probably because user is not logged in.');
  }

  yield* ...
}

Согласно этому ответу на SO, Приведенный выше способ генерации исключения из асинхронной c функции генератора выглядит нормально.

Как мне написать свой тест (с пакетом test ), чтобы проверить исключение, генерируемое этим методом?

Как-то так не работает :

test('should throw exception when user is not logged in', () {
  final _authSignedOut = MockFirebaseAuth(signedIn: false);
  final _repoWihoutUser = FirebaseProductRepository(
    storeInstance: _store,
    authInstance: _authSignedOut,
  );

  var products = _repoWihoutUser.getProducts();

  expect(products, emitsError(AuthException));
});

И не это:

expect(callback, emitsError(throwsA(predicate((e) => e is AuthException))));

Даже не это:

var callback = () {
  _repoWihoutUser.getProducts();
};

expect(callback, emitsError(throwsA(predicate((e) => e is AuthException))));

1 Ответ

1 голос
/ 12 апреля 2020

Ты рядом. Ваша первая попытка:

expect(products, emitsError(AuthException));

не работает, потому что emitsError принимает Matcher в качестве аргумента, поэтому вы не можете передать ему тип напрямую. Вместо этого вам нужно использовать isA<T>() Matcher:

expect(products, emitsError(isA<AuthException>()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...