esmock
esmock provides native ESM import mocking for unit tests. Use examples below as a quick-start guide or use the descriptive and friendly esmock guide here.
esmock
must be used with node's experimental --loader
{
"name": "give-esmock-a-star",
"type": "module",
"scripts": {
"test-uvu": "node --loader=esmock ./node_modules/uvu/bin.js ./spec/",
"test-ava": "ava --node-arguments=\"--loader=esmock\"",
"test-mocha": "mocha --loader=esmock --no-warnings"
}
}
esmock
has the following signature
await esmock(
'./to/module.js',
{ ...childmocks },
{ ...globalmocks }
);
esmock
demonstrated with ava
unit test examples
import test from 'ava';
import esmock from 'esmock';
test('should mock local files and packages', async t => {
const main = await esmock('../src/main.js', {
stringifierpackage : JSON.stringify,
'../src/hello.js' : {
default : () => 'world',
exportedFunction : () => 'foobar'
}
});
t.is(main(), JSON.stringify({ test : 'world foobar' }));
});
test('should do global instance mocks —third param', async t => {
const { getFile } = await esmock('../src/main.js', {}, {
fs : {
readFileSync : () => 'returns this globally';
}
});
t.is(getFile(), 'returns this globally');
});
test('should mock "await import()" using esmock.p', async t => {
const doAwaitImport = await esmock.p('../awaitImportLint.js', {
eslint : { ESLint : cfg => cfg }
});
t.is(await doAwaitImport('cfg'), 'cfg');
esmock.purge(doAwaitImport);
});
test('should merge "default" value, when safe', async t => {
const main = await esmock('../src/main.js');
t.is(main(), main.default());
});
test('should use implicit "default"', async t => {
const mainA = await esmock('../src/exportsMain.js', {
'../src/main.js' : () => 'mocked main'
});
const mainB = await esmock('../src/exportsMain.js', {
'../src/main.js' : { default : () => 'mocked main' }
});
t.is(mainA(), mainB());
});