I have 2 versions of the same code, one works, one throws:
TypeError: axios.get.mockResolvedValue is not a function
Works:
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'})
})
Doesn't:
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'})
})
Can someone help me understand why moving jest.mock('axios')
inside the testblock (or inside any function, for that matter) results in an error?
Jest has clearly addressed how to mock a module in this link https://jestjs.io/docs/en/manual-mocks#mocking-node-modules.
It has an important note as following:
Note: In order to mock properly, Jest needs jest.mock('moduleName') to be in the same scope as the require/import statement.
On the other hand, Most of use cases jest.mock
is supposed to be called at the top level of module should work properly:
const axios = require('axios');
// At the same scope with `require`
jest.mock('axios');