为什么即使将来已经完成,使用FakeAsync进行的测试也只是挂在“等待”上?

时间:2020-06-30 11:15:47

标签: flutter dart async-await

我正在尝试使用FakeAsync编写测试,但是它似乎挂在我的await上。这是一个简化的示例:

  test('danny', () async {
    await FakeAsync().run((FakeAsync async) async {
      print('1');
      final a = Future<bool>.delayed(const Duration(seconds: 5))
          .then((_) => print('Delayed future completed!'))
          .then((_) => true);

      print('2');
      async.elapse(const Duration(seconds: 30));
      // Tried all this too...
      // async.flushMicrotasks();
      // async.flushTimers();
      // async.elapse(const Duration(seconds: 30));
      // async.flushMicrotasks();
      // async.flushTimers();
      // async.elapseBlocking(const Duration(seconds: 30));

      print('3');
      await a;

      print('4');
      expect(1, 2);
    });
  });

此代码输出:

1
2
Delayed future completed!
3
// hangs and never prints '4'

async.elapse调用允许将来完成,但仍挂在await a上。为什么?

1 个答案:

答案 0 :(得分:0)

这似乎是因为尽管Future已完成,但await调用仍需要处理微任务队列才能继续执行(但不能,因为没有人在调用{{1 }}之后async.elapse

作为一种解决方法,在函数运行时连续地抽入microstask队列似乎可以正常工作-例如,调用该函数代替await

FakeAsync.run