gpt4 book ai didi

flutter - 为什么这个使用 FakeAsync 的测试只是卡在 "await"上,即使 future 已经完成?

转载 作者:行者123 更新时间:2023-12-04 11:30:41 26 4
gpt4 key购买 nike

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

  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 call 允许 future 完成,但它仍然卡在 await a .为什么?

最佳答案

这似乎是因为尽管 Future完成后,await call 需要处理微任务队列才能继续(但它不能,因为没有人在 async.elapse 之后调用 await )。
作为一种变通方法,在函数运行时连续抽取 microstask 队列似乎有效 - 例如调用此函数代替 FakeAsync.run :

/// Runs a callback using FakeAsync.run while continually pumping the
/// microtask queue. This avoids a deadlock when tests `await` a Future
/// which queues a microtask that will not be processed unless the queue
/// is flushed.
Future<T> runFakeAsync<T>(Future<T> Function(FakeAsync time) f) async {
return FakeAsync().run((FakeAsync time) async {
bool pump = true;
final Future<T> future = f(time).whenComplete(() => pump = false);
while (pump) {
time.flushMicrotasks();
}
return future;
}) as Future<T>;
}

关于flutter - 为什么这个使用 FakeAsync 的测试只是卡在 "await"上,即使 future 已经完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62656200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com