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',
});
});