[英]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.