仅模拟模块中的一个功能,但保留原始功能

新手上路,请多包涵

我只想模拟模块中的单个函数(名为 export),但保留其余模块函数不变。

使用 jest.mock('package-name') 使所有导出的函数模拟,这是我不想要的。

我尝试将命名的导出传播回模拟对象中……

 import * as utils from './utilities.js';

jest.mock(utils, () => ({
  ...utils
  speak: jest.fn(),
}));

但出现此错误:

jest.mock() 的模块工厂不允许引用任何超出范围的变量。

原文由 spencer.sm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 225
1 个回答

这个答案的亮点是 jest.requireActual() ,这是一个非常有用的实用程序,它开玩笑说“嘿,保持所有原始功能完好无损并导入它们”。

 jest.mock('./utilities.js', () => ({
  ...jest.requireActual('./utilities.js'),
  speak: jest.fn(),
}));

让我们来看另一种常见情况,您正在使用酶 ShallowWrapper 并且它与 useContext() 挂钩不兼容,那么您打算怎么办?虽然我确定有多种方法,但这是我喜欢的一种:

 import React from "react";

jest.mock("react", () => ({
  ...jest.requireActual("react"), // import and retain the original functionalities
  useContext: jest.fn().mockReturnValue({foo: 'bar'}) // overwrite useContext
}))

这样做的好处是您仍然可以在原始代码中使用 import React, { useContext } from "react" 而不必担心将它们转换为 React.useContext() 就像您使用 jest.spyOn(React, ‘使用上下文’)

原文由 Popsicle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题