我正在尝试使用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
上。为什么?
答案 0 :(得分:0)
这似乎是因为尽管Future
已完成,但await
调用仍需要处理微任务队列才能继续执行(但不能,因为没有人在调用{{1 }}之后async.elapse
。
作为一种解决方法,在函数运行时连续地抽入microstask队列似乎可以正常工作-例如,调用该函数代替await
:
FakeAsync.run