单元测试之异步测试测试

427 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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.useFakeTimersjest.runAllTimers可以更优雅的对延时功能的测试。

const delay = require('../delay')
it('异步测试',done => {
  jest.useFakeTimers();
  delay(()=>{
    done()
  })
  jest.runAllTimers();
  expect(true).toBe(true)
})

2、使用async 和 await

我们也可以在测试中使用asyncawait,写异步测试用例时,可以在传递给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

resolvesrejects匹配器可以让我们很方便的测试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')
  })
})