jest-mock-imports

Mock imports by changing the import path of ESModule files.

Usage no npm install needed!

<script type="module">
  import jestMockImports from 'https://cdn.skypack.dev/jest-mock-imports';
</script>

README

jest-mock-imports

Mock imports by changing the import path of ESModule and CommonJS files.

Why?

This module is meant for mocking modules that are imported by files. jest.mock is designed for mocking require, but it doesn't work for ESModules. It also doesn't do a good job mocking CommonJS files. This module is a jest transformer that changes the import and require paths of you files.

Setup

This module is meant to be used with jest.

Installing

npm i -D jest jest-mock-imports

File structure

  • __mocks__
    • fs.js
    • delete-files.js
  • lib
    • __mocks__
      • helper.js
      • lib.js
    • index.js
    • helper.js
    • lib.js
    • dir
      • __mocks__
        • tool.js
      • tool.js
  • jest.config.js
  • transformer.cjs

In this example file structure, there are a couple of files and modules being mocked.

Mocks Tables

Module Mock File
fs __mocks__/fs.js
delete-files __mocks__/delete-files.js
File Mock File
lib/helper.js lib/__mocks__/helper.js
lib/lib.js lib/__mocks__/lib.js
lib/dir/tool.js lib/dir/__mocks__/tool.js

Import Examples

lib/index.js

Normally:

import fs from 'fs'
import { myTool } from './dir/tool.js'
export { helper } from './helper.js'
export * as lib from './lib.js'
import sum from 'not-mocked'
import prime from './not-mocked.js'

When testing with jest:

import fs from '../__mocks__/fs'
import { myTool } from './dir/__mocks__/tool.js'
export { helper } from './__mocks__/helper.js'
export * as lib from './__mocks__/lib.js'
import sum from 'not-mocked'
import prime from './not-mocked.js'

jest.config.js

This tells jest to transform all files ending with .js files using the transformer.

export default {
  transform: {
    '\\.js': './transformer.cjs'
  }
}

transformer.cjs

const { mock } = require('jest-mock-imports')

const mockFn = mock({
  modules: new Map()
    .set('fs', 'fs.js') // Uses fs.js in __mocks__
    .set('delete-files', 'delete-files.js'), // Uses delete-files.js in __mocks__
  files: new Set() // All the files in this set have mocks with the same file name in the __mocks__ folder in the same level as the files.
    .add('lib/helper.js')
    .add('lib/lib.js')
    .add('lib/dir/tool.js')
})

exports.process = mockFn // Jest uses the exports.process function