繁体   English   中英

如何在非Promise函数中测试Promise回调?

[英]How to test a Promise callback inside a non-Promise function?

我有一个内部有promise函数的函数。 但是它本身并没有兑现承诺。

const toBeTestedFunc = () => {
    const promise = promiseFunc()
                   .then(() => {})
                   .catch((error) => { errorHandler() });
}

如何测试是否调用errorHanlder() 我写了类似下面的内容,但是它失败了,因为在执行promise回调之前测试已经完成。

const test = () => {
    toBeTestedFunc();
    expect(errorHandler).toBeCalled();
}

我意识到这个问题已经发布了几次。 在这种情况下,似乎没有很好的测试方法。 解决方案将是:

  • (推荐)将promise返回到toBeTestedFunc ,然后进行如下测试:

     const test = () => { toBeTestedFunc().then(() => { expect(errorHandler).toBeCalled(); }); } 

    这是用于测试异步功能的笑话文档

  • (哈克溶液的)模拟的返回值promiseFunc为类似于一个对象Promise 这样该测试将等待回调( errorHandler )被执行。 这里的例子。

感谢@Jared Smith和@mpm的帮助:)

如果没有等待异步操作的方法,那么我唯一的建议就是使用https://github.com/TheBrainFamily/wait-for-expect 这样您就可以等待声明通过

问题

如前所述,在Promise回调有机会运行之前, expect失败。

Promise回调一个机会,让它在调用expect之前运行。

当然,理想的解决方案是从函数中返回Promise并直接await它。

在不可能的情况下,可以通过使测试函数async并在已解决的Promise上调用await来允许Promise回调执行。

这实际上将其余测试排在Promise回调后面的PromiseJobs队列的末尾。

对于那些情况下Promise回调队列中的其他Promise回调,你可以链任意数量的then()调用解析的Promise要排队背后这些额外的回调测试的其余部分。


这是一个工作示例:

const errorHandler = jest.fn();
const promiseFunc = () => Promise.reject();

const toBeTestedFunc = () => {
  const promise = promiseFunc()
    .then(() => { })
    .catch((error) => { errorHandler() });
}

test('errorHandler called', async () => {   // make the test function async
  toBeTestedFunc();
  await Promise.resolve().then();   // allow the callbacks queued in PromiseJobs to run
  expect(errorHandler).toBeCalled();   // SUCCESS
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM