使用setTimeout在Jest中运行回调函数时出错

5m1hhzi4  于 2023-03-10  发布在  Jest
关注(0)|答案(1)|浏览(185)

我已经定义了函数runSafelyAsync,它是应该异步运行的promise的 Package 器,允许调用函数继续而无需等待。setTimeout总是延迟函数执行的开始。代码如下:

export function runSafelyAsync(fn: () => Promise<unknown>): void {
    const backgroundFn = async () => {
        try {
            return await fn();
        } catch (err) {
            console.log(err)
        }
    };

    setTimeout(backgroundFn, 1);
}

在一个用例中,我使用它来发送电子邮件,而不会阻塞后面的整个流程。

runSafelyAsync(() => {
   this.userService.sendEmail(); // it's async function
}

在真实的的Node.js应用程序示例上,它运行良好,并完成了它的工作。然后,我通过Jest接触上面的代码进行了一些单元和E2E测试,测试失败,并显示以下错误消息:
this.userService.sendEmail is not a function
我已经试着模拟这个函数,使其尽可能简单,但错误仍然发生。

jest.spyOn(asyncUtils, 'runSafelyAsync').mockImplementation((callback) => callback());

我使用的是jest ^28.0.2,带有Nest.js框架。为什么它只在Jest环境中发生?

rt4zxlrg

rt4zxlrg1#

this.userService.sendEmail is not a function
您遇到的错误是因为您没有模拟userService对象以使其具有sendEmail()存根。您模拟的runSafelyAsync() * 实现仍然调用传递的函数 *,因此该函数必须存在。
您需要做的是模拟sendEmail()函数(这是首选方法),或者更改模拟的runSafelyAsync()的实现,使其实际上不调用传递的函数。

相关问题