jest.mock() 内的 jest.fn() 返回未定义

Kev*_*ert 9 testing typescript reactjs jestjs create-react-app

我有一个简单的“util”模块,带有默认导出和 2 个命名导出。

const foo = () => 'foo'
export default foo
    
export const bar = () => 'bar'
export const baz = () => 'baz'
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我是这样嘲笑它的:

jest.mock('./util', () => ({
  __esModule: true,
  default: jest.fn(() => 'mocked foo'),
  bar: jest.fn(() => 'mocked bar'),
  baz: jest.fn(() => 'mocked baz'),
}))

describe('util', () => {
  //...
})
Run Code Online (Sandbox Code Playgroud)

在我的组件上,当我调用foo()bar()baz(),我收到了undefined. jest.fn()但如果我像这样删除一切都会正常:

jest.mock('./util', () => ({
  __esModule: true,
  default: () => 'mocked foo',
  bar: () => 'mocked bar',
  baz: () => 'mocked baz',
}))
Run Code Online (Sandbox Code Playgroud)

我的示例非常接近 jest 文档上的示例: https ://jestjs.io/docs/mock-functions#mocking-partials

我正在使用React (CRA) 和TypeScript

我知道模拟模块有不同的方法,但我很想了解我面临的问题。

知道我做错了什么吗?:) 谢谢 !

小智 23

我遇到了同样的问题(也在运行 CRA),发现这可能是原因:

https://github.com/facebook/jest/issues/9131#issuecomment-668790615

有点晚了,但我只是遇到了这个问题。我发现有人添加resetMocks: true到该 jest.config.js文件中。这意味着模拟函数的实现在每次测试之前都会重置。因此,在我们的例子中,模拟函数在测试运行时被包含在模拟模块中,但该模拟已被重置,因此它返回未定义。

关于最初的问题构建环境,看起来react-scripts确实添加到了resetMocks: truejest配置中。(https://github.com/facebook/create-react-app/blob/main/packages/react-scripts/scripts/utils/createJestConfig.js#L69)但是您可以在包的 jest 键上覆盖它。 json。(https://github.com/facebook/create-react-app/blob/main/packages/react-scripts/scripts/utils/createJestConfig.js#L74

  • 我知道 React17 中设置的更改,但我从未怀疑这是我的问题。你说得对,非常感谢! (3认同)