Dart复杂异步功能测试问题:如何等待同步回调执行?
解决Dart异步测试中等待回调执行的问题
你的问题核心在于测试函数执行完毕后,不会自动等待SyncService.sync()触发的onDone回调完成,导致断言无法执行。以下是几种可行的解决方法:
方法1:使用Completer手动等待回调完成
通过Completer创建一个未来对象,在onDone回调中标记未来完成,让测试函数等待这个未来,确保断言执行:
test("Sending data", () async { final comm = await Client.create("client1"); final result = await comm.sendData('client2'); expect(result, isTrue); final completer = Completer<void>(); SyncService.sync(onDone: () async { final rComm = await Client.create('client2'); final keys = await rComm.getData(); expect(keys.length, 1); completer.complete(); // 回调执行完成后通知测试继续 }); await completer.future; // 等待回调中的异步操作全部完成 });
方法2:修改SyncService.sync为异步方法(如果允许修改源码)
如果可以调整SyncService的实现,让sync方法返回一个Future,在队列处理完成后再完成这个未来,测试时直接await即可:
修改后的SyncService示例:
class SyncService { static Future<void> sync({VoidCallback? onDone}) async { // 将同步请求加入队列 _addSyncToQueue(); // 等待队列中的同步任务处理完成 await _processQueue(); // 触发回调 onDone?.call(); } // 假设这是处理队列的异步逻辑 static Future<void> _processQueue() async { // 实际的队列处理代码 } static void _addSyncToQueue() { // 原有的入队逻辑 } }
对应的测试代码:
test("Sending data", () async { final comm = await Client.create("client1"); final result = await comm.sendData('client2'); expect(result, isTrue); // 等待同步任务完全完成 await SyncService.sync(); // 直接执行断言 final rComm = await Client.create('client2'); final keys = await rComm.getData(); expect(keys.length, 1); });
方法3:使用pumpEventQueue排空微任务队列
如果使用test包进行测试,可以调用pumpEventQueue()方法,它会等待当前所有微任务队列中的操作完成,确保onDone回调被执行:
import 'package:test/test.dart'; test("Sending data", () async { final comm = await Client.create("client1"); final result = await comm.sendData('client2'); expect(result, isTrue); SyncService.sync(onDone: () async { final rComm = await Client.create('client2'); final keys = await rComm.getData(); expect(keys.length, 1); }); await pumpEventQueue(); // 等待所有微任务执行完毕 });
内容的提问来源于stack exchange,提问作者Ralfeus
相关产品推荐
相关产品推荐

