我想测试一个未初始化迟字段的类。
下面是我测试的代码:
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');
});不幸的是,当我运行我的测试时,我得到了这个错误:
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的类。
我在颤振文档中找不到解决这个问题的方法。
发布于 2022-04-17 00:05:43
Errors不是Exceptions,所以throwsException不匹配它。
LateInitializationError曾经是一种公共类型,但它似乎不再是公开的了。你可以求助于throwsA(isA<Error>())。(基于最后可获得的公开文件,它直接从Error派生,因此没有更具体的类型可供测试。)您可以检查Error字符串以便更具体:
expect(
() => dbRepository.osLang,
throwsA(
predicate<Error>(
(error) => error.toString().contains('LateInitializationError'),
),
),
);尽管如此,在我看来,对LateInitializationError的测试可能还是有点问题。理想情况下,late变量不应该作为API的一部分公开。如果您的代码需要显式初始化步骤,那么使用描述性错误消息进行显式检查就更清楚了。也就是说,而不是:
late final String someProperty;你可以有这样的东西:
String? _someProperty;
String get someProperty {
var _someProperty = this._someProperty;
if (_someProperty == null) {
throw StateError('init() must be called first');
}
return _someProperty;
}https://stackoverflow.com/questions/71897409
复制相似问题