持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
异步测试脚本执行完,单元测试就结束了,如果需要延时才能断言的结果,单元测试函数需要设置done形参,在定时回调函数中调用,显示的通过单元测试已完成
1、使用回调函数done
//delay.js
module.exports = fn => {
setTimeout(()=> fn(),1000)
}
const delay = require('../delay')
it('异步测试',done => {
delay(()=>{
done()
})
expect(true).toBe(true)
})
快进功能
基于jest提供的两个方法jest.useFakeTimers和 jest.runAllTimers可以更优雅的对延时功能的测试。
const delay = require('../delay')
it('异步测试',done => {
jest.useFakeTimers();
delay(()=>{
done()
})
jest.runAllTimers();
expect(true).toBe(true)
})
2、使用async 和 await
我们也可以在测试中使用async 和 await,写异步测试用例时,可以在传递给test的函数前面加上async。
test('请求成功', async () => {
const data = await fetchData(true)
expect(data).toBe('success message')
});
test('请求失败', async () => {
expect.assertions(1)
try {
await fetchData(false)
} catch (e) {
expect(e).toBe('error message')
}
});
3、使用resolves 和 rejects
resolves和rejects匹配器可以让我们很方便的测试Promise。当然不要忘记将整个断言作为返回值返回
test('请求成功', () => {
// 不要忘记将整个断言作为返回值返回
return expect(fetchData(true)).resolves.toBe('success message')
});
test('请求失败', () => {
// 不要忘记将整个断言作为返回值返回
return expect(fetchData(false)).resolves.toBe('error message')
});
4、使用Promise
如果异步代码使用了Promise,需要在测试用例中将Promise对象返回
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Hello world')
}, 1000);
})
}
test('Promise', () => {
// 一定记得加上 return,否则测试在 fetchData 执行完成之前就已经结束,随后then中的expect也不会执行,会导致超时错误!!!
return fetchData().then(data => {
expect(data).toBe('welcome')
})
})