Skip to content
Advertisement

Jest change mock implementation for a POJO module between tests

I am trying to mock the import of a Plain Old Javascript Object in a test, where I want different implementations for each test.

If I mock at the top of the file it works as expected:

import { getConfig } from './'; // this contains the import config from 'configAlias';

jest.mock('configAlias', () => ({
  hello: 'world',
}));

it('passes test', () => {
  expect(getConfig()).toEqual({
    hello: 'world,
  });
});

But I cannot find any combination of doMock, default over named exports, mockImplementation to get the following to work:

import { getConfig } from './'; // this contains the import config from 'configAlias';


it('fails test1', () => {
  jest.doMock('configAlias', () => ({
    hello: 'world',
  }));
  const config = require('configAlias');

  expect(getConfig()).toEqual({
    hello: 'world,
  });
});

it('fails test2', () => {
  jest.doMock('configAlias', () => ({
    hello: 'moon',
  }));
  const config = require('configAlias');

  expect(getConfig()).toEqual({
    hello: 'moon,
  });
});

Edit 1

Based on @jonrsharpe I have tried

import { getConfig } from './'; // this contains the import config from 'configAlias';

const mockConfig = jest.fn();
jest.mock('configAlias', () => mockConfig);

it('fails test', () => {
  mockConfig.mockImplementation({
    hello: 'world',
  });
  expect(getSchema()).toEqual({ hello: 'world' });
});

Advertisement

Answer

Worked it out, the trick is to import/require the file under test (not the mocked file) AFTER setting the mock in the individual test. No import at the top of the file.

beforeEach(() => {
  jest.resetModules();
});

it('passes test 1', () => {
  jest.mock('configAlias', () => ({
    hello: 'world',
  }));
  const { getConfig } = require('getConfig');

  expect(getConfig()).toEqual({
    hello: 'world',
  });
});

it('passes test 2', () => {
  jest.mock('configAlias', () => ({
    hello: 'moon',
  }));
  const { getConfig } = require('getConfig');

  expect(getConfig()).toEqual({
    hello: 'moon',
  });
});
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement