Jest 如何测试 Promise 里面的 setTimeout

发布于 2022-09-12 01:28:58 字数 518 浏览 15 评论 0

const delay = (time = 0) => new Promise((resolve) =>     setTimeout(resolve, time));

jest 如何测试这个函数

我现在这样写的,没有通过

it('测试 createContext context.delay 延时是否成功', async () => {
expect.assertions(1);
const context = createContext(api, namespace);
const callback = jest.fn();

// 延时 1000 毫秒
context.delay(1000).then(callback);
jest.advanceTimersByTime(1000);

const asyncTest = async () => {
  expect(callback).toBeCalled();
};

await asyncTest();
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

遗心遗梦遗幸福 2022-09-19 01:28:58

把 async 改成了原生的 setTimeout ,测试通过
猜测是因为 async 是微任务,setTimeout 是宏任务 ,所以用 async 包裹测试代码,promise 里面的 setTimeout 总是后于 async 执行,用宏任务的 setTimeout 包裹测试代码就解决了执行顺序的问题


const Time = setTimeout;

jest.useFakeTimers();

it('测试 createContext context.delay 延时是否成功', (done) => {
const context = createContext(api, namespace);
const callback = jest.fn();

// 延时 1000 毫秒
context.delay(1000).then(callback);

// 这个时候 setTimeout 应该已经执行
expect(setTimeout).toHaveBeenCalledTimes(1);

// 快进 1000 毫秒, 这个时候 callback 应该已经被执行
jest.advanceTimersByTime(1000);

Time(() => {
  expect(callback).toBeCalled();
  done();
});
});

控制台输出:

const delay = (time = 0) => new Promise((resolve) => setTimeout(resolve, time));
delay().then(()=>console.log('delay'));
setTimeout(()=>console.log('setTimeout'));

打印结果为 delay, setTimeout
酒儿 2022-09-19 01:28:58

自己试着修改了一下,也是不行。我觉得换个思路,不要去测试promise,直接测试setTimeout函数吧。实际开发过程中测试覆盖率达到100%,基本也是很困难的

夏尔 2022-09-19 01:28:58
it('测试 delay 函数延迟是否成功', async () => {
  const mockCallback = jest.fn();

  setTimeout(mockCallback, 1000);

  expect(mockCallback).not.toHaveBeenCalled(); // Success!

  await delay(1000);

  expect(mockCallback).toHaveBeenCalled(); // Success!
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文