flutter - 如何测试异步生成器引发的异常?

标签 flutter exception dart stream

我在Flutter应用程序中有一个repository类,使用以下方法返回Stream:

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上的this answer,从异步生成器函数引发异常的上述方法看起来不错。

如何编写测试(使用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))));

最佳答案

你近了您的第一次尝试:

expect(products, emitsError(AuthException));

不起作用,因为 emitsError Matcher作为其参数,因此您不能直接将其传递给类型。相反,您需要使用 isA<T>() Matcher:

expect(products, emitsError(isA<AuthException>()));

关于flutter - 如何测试异步生成器引发的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61166608/

相关文章:

android - Flutter multi_image_picker相机选项未在iOS中显示。当我已经启用摄像头并将权限写入info.plist中时

python - 从 paramiko 捕获异常

javascript - Dart 中的镜子不适用于所有元素

android - 必须为文本窗口小部件提供非空字符串。 'package:flutter/src/widgets/text.dart':断言失败:第360行pos 10: 'data != null'

flutter 水平滚动一项一项

ios - Ipa 文件仅安装在某些 iOS 设备上

android - 如何在 Flutter 中创建可水平滚动的垂直 ListView ?

flutter - overflow hidden flutter,没有溢出的消息

java - Joda DateTime 非法值

language-agnostic - 捕获异常时真的会影响性能吗?