Open
Description
c8
shows uncovered lines, but the whole file is covered.
Version: output of node -v
16.9.0
Platform: output of uname -a
Darwin
- Version: latest
- Platform: mac os
Repository https://github.com/coderaiser/c8-reproduce
When I'm using loaders to mock imports
the coverage I see is broken.
Code:
import {
readFile,
} from 'fs/promises';
import {
execSync,
} from 'child_process';
export default (a, b, c) => {
if (a)
return readFile();
if (c)
return execSync();
return 'd';
};
Tests:
import {createMockImport} from 'mock-import';
import {
test,
stub,
} from 'supertape';
const {mockImport, reImport, stopAll} = createMockImport(import.meta.url);
test('changelog: a', async (t) => {
mockImport('fs/promises', {
readFile: stub().returns('a'),
});
const fn = await reImport('./changelog.js');
stopAll();
t.equal(fn.default(1), 'a');
});
test('changelog: c', async (t) => {
mockImport('child_process', {
execSync: stub().returns('c'),
});
const fn = await reImport('./changelog.js');
stopAll();
t.equal(fn.default(0, 0, 1), 'c');
});
test('changelog: d', async (t) => {
const fn = await import('./changelog.js?count=4');
t.equal(fn.default(0, 0, 0, 1), 'd');
});
What mock-import does is converts source to:
const {
readFile: readFile
} = global.__mockImportCache.get('fs/promises');
import {
execSync,
} from 'child_process';
export default (a, b, c) => {
if (a)
return readFile();
if (c)
return execSync();
return 'd';
};
And imports
it as ./changelog.js?count=1
on first test, then on second test:
import {
readFile
} from 'fs/promises'
const {
execSync,
} = global.__mockImportCache.get('fs/promises');
export default (a, b, c) => {
if (a)
return readFile();
if (c)
return execSync();
return 'd';
};
File imported
as ./changelog.js?count=2
, and then on third assertion code isn't changed.