You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:20:35