javascript - 仅模拟模块中的一项功能,但保留原始功能

标签 javascript unit-testing jestjs

我只想从一个模块中模拟一个函数(名为导出),但保持其余模块函数不变。

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

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

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

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


但收到此错误:

The module factory of jest.mock() is not allowed to reference any out-of-scope variables.

最佳答案

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

jest.mock('./utilities.js', () => ({
  ...jest.requireActual('./utilities.js'),
  speak: jest.fn(),
}));
让我们看另一个常见的场景,你正在使用 enzyme ShallowWrapper 并且它与 useContext() Hook 并不顺利,那么你会怎么做?虽然我确定有多种方法,但这是我喜欢的一种:
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, 'useContext')

关于javascript - 仅模拟模块中的一项功能,但保留原始功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59312671/

相关文章:

javascript - Angular 1.X 创建一个表单,其值通过按钮增加/减少

javascript - 更新或更改或删除/重置 Javascript 事件监听器

unit-testing - tensorflow 测试中的 eager 和 graph 执行

java - 单击第二个 Activity 的按钮在 View 上执行 'single click' 或 'scroll to' 时出错

用于测试性能的 C++ 单元测试(综合基准)

javascript - 在 Jest 中插入嵌套函数

javascript - 如何按日期对ant表列进行排序?

javascript - FizzBu​​zz 只打印能被三整除的数字

reactjs - 如何使用 React 测试库模拟 Stencil Web 组件?

reactjs - React Native + Jest + enzyme : Why does Enzyme not recognize some components?