我已经定义了函数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环境中发生?
1条答案
按热度按时间rt4zxlrg1#
this.userService.sendEmail is not a function
您遇到的错误是因为您没有模拟
userService
对象以使其具有sendEmail()
存根。您模拟的runSafelyAsync()
* 实现仍然调用传递的函数 *,因此该函数必须存在。您需要做的是模拟
sendEmail()
函数(这是首选方法),或者更改模拟的runSafelyAsync()
的实现,使其实际上不调用传递的函数。