How to mock an exported const in jest How to mock an exported const in jest reactjs reactjs

How to mock an exported const in jest


This example will work if you compile ES6 modules syntax into ES5, because in the end, all module exports belong to the same object, which can be modified.

import { allowThrough } from './allowThrough';import { ENABLED } from './constants';import * as constants from './constants';describe('allowThrough', () => {    test('success', () => {        constants.ENABLED = true;        expect(ENABLED).toBe(true);        expect(allowThrough({ value: 1 })).toBe(true);    });    test('fail, ENABLED === false', () => {        constants.ENABLED = false;        expect(ENABLED).toBe(false);        expect(allowThrough({ value: 1 })).toBe(false);    });});

Alternatively, you can switch to raw commonjs require function, and do it like this with the help of jest.mock(...):

const mockTrue = { ENABLED: true };const mockFalse = { ENABLED: false };describe('allowThrough', () => {    beforeEach(() => {        jest.resetModules();    });    test('success', () => {        jest.mock('./constants', () => mockTrue)        const { ENABLED } = require('./constants');        const { allowThrough } = require('./allowThrough');        expect(ENABLED).toBe(true);        expect(allowThrough({ value: 1 })).toBe(true);    });    test('fail, ENABLED === false', () => {        jest.mock('./constants', () => mockFalse)        const { ENABLED } = require('./constants');        const { allowThrough } = require('./allowThrough');        expect(ENABLED).toBe(false);        expect(allowThrough({ value: 1 })).toBe(false);    });});


There is another way to do it in ES6+ and jest 22.1.0+ thanks to getters and spyOn.

By default, you cannot spy on primitive types like boolean or number. You can though replace an imported file with your own mock. A getter method still acts like a primitive member but allows us to spy on it. Having a spy on our target member you can basically do with it whatever you want, just like with a jest.fn() mock.

Below an example

// foo.jsexport const foo = true; // could be expression as well
// subject.jsimport { foo } from './foo'export default () => foo
// subject.spec.jsimport subject from './subject'jest.mock('./foo', () => ({  get foo () {    return true // set some default value  }}))describe('subject', () => {  const mySpy = jest.spyOn(subject.default, 'foo', 'get')  it('foo returns true', () => {    expect(subject.foo).toBe(true)  })  it('foo returns false', () => {    mySpy.mockReturnValueOnce(false)    expect(subject.foo).toBe(false)  })})

Read more in the docs.


Unfortunately none of the posted solutions worked for me or to be more precise some did work but threw linting, TypeScript or compilation errors, so I will post my solution that both works for me and is compliant with current coding standards:

// constants.ts// configuration file with defined constant(s)export const someConstantValue = true;
// module.ts// this module uses the defined constantsimport { someConstantValue } from './constants';export const someCheck = () => someConstantValue ? 'true' : 'false';
// module.test.ts// this is the test file for module.tsimport { someCheck } from './module';const mockSomeConstantValueGetter = jest.fn();jest.mock('./constants', () => ({  get someConstantValue() {    return mockSomeConstantValueGetter();  },}));describe('someCheck', () => {  it('returns "true" if someConstantValue is true', () => {    mockSomeConstantValueGetter.mockReturnValue(true);    expect(someCheck()).toEqual('true');  });  it('returns "false" if someConstantValue is false', () => {    mockSomeConstantValueGetter.mockReturnValue(false);    expect(someCheck()).toEqual('false');  });});