How to spy on a default exported function with Jest? How to spy on a default exported function with Jest? reactjs reactjs

How to spy on a default exported function with Jest?


I ended up ditching the default export:

// UniqueIdGenerator.jsexport const uniqueIdGenerator = () => Math.random().toString(36).substring(2, 8);

And then I could use and spy it like this:

import * as UniqueIdGenerator from './UniqueIdGenerator';// ...const spy = jest.spyOn(UniqueIdGenerator, 'uniqueIdGenerator');

Some recommend wrapping them in a const object, and exporting that. I suppose you can also use a class for wrapping.

However, if you can't modify the class there's still a (not-so-nice) solution:

import * as UniqueIdGenerator from './UniqueIdGenerator';// ...const spy = jest.spyOn(UniqueIdGenerator, 'default');


In some cases you have to mock the import to be able to spy the default export:

import * as fetch from 'node-fetch'jest.mock('node-fetch', () => ({  default: jest.fn(),}))jest.spyOn(fetch, 'default')


one could also mock the import and pass the original implementation as mock implementation, like:

import uniqueIdGenerator from './UniqueIdGenerator'; // this import is a mock alreadyjest.mock('./UniqueIdGenerator.js', () => {  const original = jest. requireActual('./UniqueIdGenerator')  return {     __esModule: true,     default: jest.fn(original.default)  }})test(() => {  expect(uniqueIdGenerator).toHaveBeenCalled()})