开玩笑嘲笑:TypeError:axios.get.mockResolvedValue 不是函数

ilm*_*moi 30 javascript unit-testing jestjs

我有相同代码的 2 个版本,一种有效,一种抛出:

TypeError: axios.get.mockResolvedValue is not a function
Run Code Online (Sandbox Code Playgroud)

作品:

const axios = require('axios')
jest.mock('axios') //<<<------

test('should mock axios', async () => {
  const resp = {data: {moreData: 'zedata'}}
  axios.get.mockResolvedValue(resp)
  const actualresp = await getAxios()
  expect(actualresp).toEqual({moreData: 'zedata'})
})
Run Code Online (Sandbox Code Playgroud)

不:

const axios = require('axios')

test('should mock axios', async () => {
  jest.mock('axios') //<<<------
  const resp = {data: {moreData: 'zedata'}}
  axios.get.mockResolvedValue(resp)
  const actualresp = await getAxios()
  expect(actualresp).toEqual({moreData: 'zedata'})
})
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解为什么jest.mock('axios')在测试块内部(或在任何函数内部)移动会导致错误吗?

tmh*_*005 39

Jest 在此链接中明确说明了如何模拟模块https://jestjs.io/docs/en/manual-mocks#mocking-node-modules

它有一个重要的注释如下:

注意:为了正确模拟,Jest 需要 jest.mock('moduleName') 与 require/import 语句位于同一范围内。

另一方面,大多数用例jest.mock应该在模块的顶层调用,应该可以正常工作:

const axios = require('axios');
// At the same scope with `require`
jest.mock('axios');
Run Code Online (Sandbox Code Playgroud)

  • 谢谢我错过了这个。正在查看他们文档的不同部分。 (3认同)
  • 不敢相信这在 2022 年仍然有用...... (3认同)