Dart:异步方法等待事件及异步事件触发测试方案
测试异步触发的事件 & Dart中等待事件的方法
针对你遇到的异步事件测试场景,核心思路就是获取一个能标记事件完成的异步信号,让测试代码等待这个信号完成后再执行断言。下面给你两种常用的实现方式:
方法一:使用Completer手动控制异步等待
Completer是Dart里创建自定义Future的工具,我们可以用它监听异步事件,当事件触发时完成这个Future,让测试代码等待它:
test('stringBindable_input_firesAsyncEvent', () async { iBindable str = BindableFactory.fromType(Types.String_); bool wasTriggered = false; final completer = Completer<void>(); str.onChangeForGui.listen((v) { wasTriggered = true; completer.complete(); // 事件触发时,完成Future }); str.input("test"); // 触发异步事件 await completer.future; // 等待事件完成 expect(wasTriggered, isTrue); });
注意测试方法必须加上async关键字,这样才能使用await等待Future完成。
方法二:利用Stream的first属性(更简洁)
因为你的事件是通过Stream发送的,我们可以直接等待Stream的第一个事件,这是异步测试里很常用的技巧:
方式A:直接等待事件后断言
test('stringBindable_input_firesAsyncEvent', () async { iBindable str = BindableFactory.fromType(Types.String_); // 先订阅,然后触发事件,等待第一个事件 final eventFuture = str.onChangeForGui.first; str.input("test"); await eventFuture; // 等待异步事件触发 expect(true, isTrue); // 也可以根据需求验证事件携带的value });
方式B:用expectLater直接验证事件值
如果还想同时验证事件传递的v值,可以用expectLater,它会自动等待Future完成并做断言:
test('stringBindable_input_firesAsyncEvent', () async { iBindable str = BindableFactory.fromType(Types.String_); // 先声明要监听的事件预期 expectLater(str.onChangeForGui.first, equals("test")); str.input("test"); // 触发异步事件 // 这里不需要额外await,expectLater会自动等待 });
总结Dart中等待事件的通用思路
不管是测试还是业务代码里,要等待某个异步事件触发,本质都是:
- 找到事件对应的异步信号(比如Stream、Future)
- 使用
await等待这个信号完成,或者用Completer手动创建一个等待信号
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

