如何在 angular 测试中等待异步方法?
How to wait on async method in an angular test?
在 angular 应用程序中,我使用了一些工具库和我的一些代码:
- 异步声明
- 在我不想等待的内部使用 setInterval。
我发现 this article 展示了如何使用 fakeAsync、flushMicrotask 和 tick,它们似乎可以完成工作,但似乎不起作用。
目前我有这个:
it('should refresh the token in time', fakeAsync(() => {
//Arrange
let token = null;
generateToken().then(result => {
token = result;
console.log('Generated token: ' + token); //properly displayed
});
flushMicrotasks();
expect(token).not.toBeNull(); //crashes
//Rest of the test
}));
});
但似乎 expect
在 generateToken
方法之前执行。
(generateToken
returns 一个 Promise 并基本上用 jose 库生成一个测试令牌)
我可以在“it”方法中使用异步声明,但我的理解是这不会解决我的实际问题,以加速 setInterval
推荐的测试异步代码的方法有变化吗?或者我错过了什么?
只需 await
结果
it('should refresh the token in time', async () =>{
const token = await generateToken();
expect(token).not.toBeNull();
});
这样你可以序列化代码执行。
你试过tick
和flush
了吗?
let token = null;
generateToken().then(result => {
token = result;
console.log('Generated token: ' + token); //properly displayed
});
tick(2 * 60 * 1000); // move time 2 minutes in a fake way
flush();
// can also use discardPeriodicTasks(); instead of flush
expect(token).not.toBeNull();
刻度应该以虚假的方式将时间移动 2 分钟,flush
应该摆脱 setInterval
。您不能使用 flushMicroTrasks()
,因为这会刷新微任务(承诺),而不是像 setInterval
或 setTimeout
这样的 Web API。 Web API 是宏任务。
在 angular 应用程序中,我使用了一些工具库和我的一些代码:
- 异步声明
- 在我不想等待的内部使用 setInterval。
我发现 this article 展示了如何使用 fakeAsync、flushMicrotask 和 tick,它们似乎可以完成工作,但似乎不起作用。
目前我有这个:
it('should refresh the token in time', fakeAsync(() => {
//Arrange
let token = null;
generateToken().then(result => {
token = result;
console.log('Generated token: ' + token); //properly displayed
});
flushMicrotasks();
expect(token).not.toBeNull(); //crashes
//Rest of the test
}));
});
但似乎 expect
在 generateToken
方法之前执行。
(generateToken
returns 一个 Promise 并基本上用 jose 库生成一个测试令牌)
我可以在“it”方法中使用异步声明,但我的理解是这不会解决我的实际问题,以加速 setInterval
推荐的测试异步代码的方法有变化吗?或者我错过了什么?
只需 await
结果
it('should refresh the token in time', async () =>{
const token = await generateToken();
expect(token).not.toBeNull();
});
这样你可以序列化代码执行。
你试过tick
和flush
了吗?
let token = null;
generateToken().then(result => {
token = result;
console.log('Generated token: ' + token); //properly displayed
});
tick(2 * 60 * 1000); // move time 2 minutes in a fake way
flush();
// can also use discardPeriodicTasks(); instead of flush
expect(token).not.toBeNull();
刻度应该以虚假的方式将时间移动 2 分钟,flush
应该摆脱 setInterval
。您不能使用 flushMicroTrasks()
,因为这会刷新微任务(承诺),而不是像 setInterval
或 setTimeout
这样的 Web API。 Web API 是宏任务。