如何用 flutter_test 等待预定的未来?
How to wait scheduled future with flutter_test?
我的小部件执行一个异步任务,我想检查它是否完成。
但是小部件测试器似乎在任务执行之前终止了测试。整个代码是 here.
class MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
test();
}
Stream<int?> stream(Future<void> Function() worker) async* {
Stream<int?> work() async* {
await worker();
yield 3;
}
yield* work();
}
Future<void> sampleWorker() async {
throw Error();
}
Future<void> test() async {
print('start');
try {
await for (final v in stream(sampleWorker)) {
print(v);
}
print('point 1');
} catch (error, stack) {
print(stack);
}
print('done');
}
}
void main() {
testWidgets('Widget test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());
await tester.pumpAndSettle(const Duration(milliseconds: 1000));
});
test('Plain test', () async {
await MyHomePageState().test();
});
}
我希望两个测试都打印堆栈跟踪,但只有 'Plain test' 显示了预期的行为。以下为日志
start
✓ Widget test
start
#0 MyHomePageState.sampleWorker (package:bug_report/main.dart:48:5)
#1 MyHomePageState.stream.work (package:bug_report/main.dart:40:19)
<asynchronous suspension>
#2 StackZoneSpecification._registerUnaryCallback.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart)
<asynchronous suspension>
done
✓ Plain test
如何进行第一次测试打印堆栈跟踪?我不应该等待 test()
因为它应该是小部件的内部任务。
尝试使用 WidgetTester
的 runAsync
函数等待任意时间让内部小部件的异步任务完成。
我的小部件执行一个异步任务,我想检查它是否完成。
但是小部件测试器似乎在任务执行之前终止了测试。整个代码是 here.
class MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
test();
}
Stream<int?> stream(Future<void> Function() worker) async* {
Stream<int?> work() async* {
await worker();
yield 3;
}
yield* work();
}
Future<void> sampleWorker() async {
throw Error();
}
Future<void> test() async {
print('start');
try {
await for (final v in stream(sampleWorker)) {
print(v);
}
print('point 1');
} catch (error, stack) {
print(stack);
}
print('done');
}
}
void main() {
testWidgets('Widget test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());
await tester.pumpAndSettle(const Duration(milliseconds: 1000));
});
test('Plain test', () async {
await MyHomePageState().test();
});
}
我希望两个测试都打印堆栈跟踪,但只有 'Plain test' 显示了预期的行为。以下为日志
start
✓ Widget test
start
#0 MyHomePageState.sampleWorker (package:bug_report/main.dart:48:5)
#1 MyHomePageState.stream.work (package:bug_report/main.dart:40:19)
<asynchronous suspension>
#2 StackZoneSpecification._registerUnaryCallback.<anonymous closure> (package:stack_trace/src/stack_zone_specification.dart)
<asynchronous suspension>
done
✓ Plain test
如何进行第一次测试打印堆栈跟踪?我不应该等待 test()
因为它应该是小部件的内部任务。
尝试使用 WidgetTester
的 runAsync
函数等待任意时间让内部小部件的异步任务完成。