我有代码可以做类似的事情
function myFunc(condition){
if(condition){
process.exit(ERROR_CODE)
}
}
我如何在 Jest 中测试它?用jest.fn()
覆盖process
中的exit
并在测试不起作用后将其返回,因为进程退出
最佳答案
此线程中的其他建议会导致我这边出现错误,任何使用 process.exit
的测试都会无限期地运行。以下选项适用于 TypeScript,但它也适用于 JavaScript:
const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {});
myFunc(condition);
expect(mockExit).toHaveBeenCalledWith(ERROR_CODE);
要注意的是,简单地使用 spyOn
意味着原始的 process.exit()
函数仍然被调用,结束进程线程并挂起测试。最后使用 mockImplementation
将函数体替换为提供的函数(在我的示例中为空)。
这个技巧对于打印到标准输出的测试也很有用。例如:
const println = (text: string) => { process.stdout.write(text + '\n'); };
const mockStdout = jest.spyOn(process.stdout, 'write').mockImplementation(() => {});
println('This is a text.');
expect(mockStdout).toHaveBeenCalledWith('This is a text.\n');
这将让您测试打印的值,并获得额外的好处,即不会因随机换行而弄乱 CLI 控制台输出。
请注意:与任何“jest.spyOn”调用一样,无论是否使用模拟实现,您都需要稍后恢复它,以避免挥之不去的模拟产生奇怪的副作用。因此,请记住在当前测试用例的末尾调用以下两个函数:
mockExit.mockRestore()
mockStdout.mockRestore()
关于javascript - stubbing process.exit 开 Jest ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46148169/