问题描述

当测试用例包含异步逻辑时,直接在异步逻辑函数里使用expect会导致测试失败

解决方案

不能直接在异步函数里直接使用expect函数,因为watch函数是同步的,it不会等待异步函数中的异步逻辑,需要在it中等待watch的异步逻辑调用完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
it('watch invalidate callback should be work', async () => {
const data = reactive({
a: 1,
b: 2,
});
let globalValue = 0;
watch(
() => data.a,
async (_newValue, _, onInvalidate) => {
let isInvalidate = false;
let res: number;
onInvalidate(() => {
isInvalidate = true;
});
if (data.a === 2) {
res = await new Promise(re => {
setTimeout(() => {
re(999);
}, 50);
});
} else {
res = await new Promise(re => {
setTimeout(() => {
re(3);
}, 100);
});
}

if (!isInvalidate) {
globalValue = res;
}
},
);
data.a++;
data.a++;
await new Promise(resolve => setTimeout(resolve, 500)); // 应该在这里等待
expect(globalValue).toBe(3);
});