Dart测试中已初始化变量仍报“未赋值变量”错误的解决方法
问题原因
Dart的空安全静态分析器无法识别测试框架中setUp方法会在test执行前调用的逻辑,因此它会判定sut变量在测试代码中使用时可能处于未初始化状态,从而抛出错误。
解决方案
方案一:使用late关键字声明变量
通过late明确告知分析器,该变量会在首次使用前完成初始化,这是最简洁优雅的处理方式:
void main() { RethinkDb r = RethinkDb(); late Connection connection; late UserService sut; setUp(() async { connection = await r.connect(host: "127.0.0.1", port: 28015); await createDb(r, connection); sut = UserService(r, connection); // second line }); test('creates a new user document in database', () async { final user = User( userName: 'test', photoUrl: 'url', active: true, lastSeen: DateTime.now(), ); final userWithId = await sut.connect(user); // first line expect(userWithId.id, isNotEmpty); }); }
方案二:声明为可空类型并添加非空断言
将变量声明为可空类型,在使用时通过!断言变量已完成初始化(此方式需要确保变量确实会被初始化,否则运行时会抛出异常):
void main() { RethinkDb r = RethinkDb(); Connection? connection; UserService? sut; setUp(() async { connection = await r.connect(host: "127.0.0.1", port: 28015); await createDb(r, connection!); sut = UserService(r, connection!); // second line }); test('creates a new user document in database', () async { final user = User( userName: 'test', photoUrl: 'url', active: true, lastSeen: DateTime.now(), ); final userWithId = await sut!.connect(user); // first line expect(userWithId.id, isNotEmpty); }); }
内容的提问来源于stack exchange,提问作者Mikelenjilo
相关产品推荐
相关产品推荐

