javascript - stubbing process.exit 开 Jest

标签 javascript mocking jestjs spy

我有代码可以做类似的事情

 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/

相关文章:

python - 在单个模拟变量中跨不同文件模拟相同的 Python 函数

unit-testing - 能够将数组传递给模拟方法调用

javascript - Jest Mock 返回未定义而不是数据

javascript - 如何在alertify.JS提示对话框中添加html元素?

javascript - CanvasJS - 根据用户输入渲染时间线图表

javascript - 将自定义部分添加到 v-autocomplete 下拉列表

Python 3 : how to tests exceptions within with?

typescript - []' is missing the following properties from type ' Promise<Cats[]>' : then, catch, [Symbol.toStringTag], 最后是 ts(2739)

typescript - 为每个测试创建一个单独的(在内存中)数据库

javascript - 如何动态获取组名称并进行循环javascript