首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振单元测试-如何测试对字段的访问引发LateInitializationError

颤振单元测试-如何测试对字段的访问引发LateInitializationError
EN

Stack Overflow用户
提问于 2022-04-16 20:49:33
回答 1查看 226关注 0票数 0

我想测试一个未初始化迟字段的类。

下面是我测试的代码:

代码语言:javascript
复制
test('Set lang method', ()  {
    // Throws an exception because the field osLang is not supposed to be initialized yet.
    expect(() => dbRepository.osLang, throwsException); 
    dbRepository.setOsLang('fr');
    expect(dbRepository.osLang, 'fr');
});

不幸的是,当我运行我的测试时,我得到了这个错误:

代码语言:javascript
复制
package:test_api                                           expect
package:flutter_test/src/widget_tester.dart 455:16         expect
test/src/models/repositories/db_repository_test.dart 20:7  main.<fn>.<fn>

Expected: throws <Instance of 'Exception'>
  Actual: <Closure: () => String>
   Which: threw LateError:<LateInitializationError: Field '_osLang@19447861' has not been initialized.>
          stack package:my_app/src/models/repositories/db_repository.dart        DBRepository._osLang
                package:my_app/src/models/repositories/db_repository.dart 18:24  DBRepository.osLang
                test/src/models/repositories/db_repository_test.dart 20:33       main.<fn>.<fn>.<fn>
                package:test_api                                                 expect
                package:flutter_test/src/widget_tester.dart 455:16               expect
                test/src/models/repositories/db_repository_test.dart 20:7        main.<fn>.<fn>
                
          which is not an instance of 'Exception'

我试图用throwsException修改throwsA(isA<LateInitializationError>),但是我的IDE没有找到任何名为LateInitializationError的类。

我在颤振文档中找不到解决这个问题的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-17 00:05:43

Errors不是Exceptions,所以throwsException不匹配它。

LateInitializationError曾经是一种公共类型,但它似乎不再是公开的了。你可以求助于throwsA(isA<Error>())。(基于最后可获得的公开文件,它直接从Error派生,因此没有更具体的类型可供测试。)您可以检查Error字符串以便更具体:

代码语言:javascript
复制
expect(
  () => dbRepository.osLang,
  throwsA(
    predicate<Error>(
      (error) => error.toString().contains('LateInitializationError'),
    ),
  ),
);

尽管如此,在我看来,对LateInitializationError的测试可能还是有点问题。理想情况下,late变量不应该作为API的一部分公开。如果您的代码需要显式初始化步骤,那么使用描述性错误消息进行显式检查就更清楚了。也就是说,而不是:

代码语言:javascript
复制
late final String someProperty;

你可以有这样的东西:

代码语言:javascript
复制
String? _someProperty;

String get someProperty {
  var _someProperty = this._someProperty;
  if (_someProperty == null) {
    throw StateError('init() must be called first');
  }
  return _someProperty;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71897409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档