首页 > 解决方案 > 如何用flutter_test等待预定的未来?

问题描述

我的小部件执行一个异步任务,我想检查它是否完成。

但似乎小部件测试器在任务执行之前终止了测试。完整的代码在这里

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();
  });
}

我希望这两个测试都打印堆栈跟踪,但只有“普通测试”显示预期的行为。以下是日志。

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(),因为它应该是小部件的内部任务。

标签: flutterflutter-test

解决方案


TryWidgetTesterrunAsync函数可以等待任意时间,以完成内部小部件的异步任务。


推荐阅读