我想測驗一個尚未初始化后期欄位的類。
這是我的測驗代碼:
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'
我試圖更改throwsExceptionwiththrowsA(isA<LateInitializationError>)但我的 IDE 沒有找到任何名為LateInitializationError.
我在顫振檔案中找不到該問題的解決方案,所以我在這里問它。感謝您的回答。
uj5u.com熱心網友回復:
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://www.uj5u.com/shujuku/460508.html
