jest 学习:异步代码的测试

在JavaScript中执行异步代码是很常见的。 当你有以异步方式运行的代码时,Jest 需要知道当前它测试的代码是否已完成,然后它可以转移到另一个测试。
更新于: 2021-12-19 12:57:29

回调:最常见的异步模式是回调函数

function delayExecute(fn: (res: string) => void, delay?: number) {
  delay = typeof delay === 'undefined' ? 1000 : delay;
  setTimeout(() => {
    fn(String(delay));
  }, delay);
}
import { delayExecute } from './async';

test('delayExecute: default 1000/0, when delay is empty/0', (done) => {
  delayExecute((res) => {
    expect(res).toBe('1000');
    done();
  });

  delayExecute((res) => {
    expect(res).toBe('0');
    done();
  }, 0);
});

Promises

如果你使用Promise,则测试异步代码有一种更简单的方案。 为你的测试返回一个Promise,则Jest会等待Promise的resove状态 如果 Promise 被拒绝,则测试将自动失败。

test('fetData: should get login/username from github', () => {
  return fetchData().then((data: any) => {
    expect(data.login).toBe('afeiship');
  });
});

.resolves / .rejects

test('fetData: resolves should match object.', () => {
  return expect(fetchData()).resolves.toMatchObject({ login: 'afeiship' });
});

Async/Await

test('fetchData: use async', async () => {
  const data = await fetchData();
  expect(data).toMatchObject({ login: 'afeiship' });
});

参考

https://jestjs.io/zh-Hans/docs/asynchronous