хуйу нас не матерятся
Т.к. всё что импортируется доступно только для чтения, все стандартные способы импорта, которые предоставляют sinon или jest не работают.
Например, если мы попытаемся изменить экспорт через прототип:
import * as anySubmodule from '../src/anySubmodule.js';
...
sinon.stub(anySubmodule.prototype, 'anySubmoduleMethod').callsFake(() => null);
То узнаем, что прототипа у нас нет:
Error: Trying to stub property 'anySubmoduleMethod' of undefined
Ну, или в интернетах есть куча говнокомментов в стиле "просто замокайте как обычно":
import * as anySubmodule from '../src/anySubmodule.js';
...
sinon.stub(anySubmodule, 'anySubmoduleMethod');
В этом случае опять столкнёмся с суровой действительностью:
TypeError: ES Modules cannot be stubbed
Единственный правильный способ замокать es6 импорты- использовать специальный nodejs лоадер, который позволит это сделать.
У себя я использую esmock, совместно с mocha. Для этого, моке нужно сказать, чтобы она заюзала лоадер:
"scripts": {
"test": "mocha --exit --es-module-specifier-resolution=node --experimental-modules --loader=esmock test/**/*.test.js",
},
Затем в самом тесте используем не стандартный импорт, а именно esmock:
...
import esmock from 'esmock';
...
it('Any test case', async () => {
const { default: any_default_method_in_my_module } = await esmock('./my_module', {
'./submodule_used_in_module': {
async imported_from_submodule_function() {
return 'ololo';
},
},
}, {});
});
...
Дока по лоадеру: https://www.npmjs.com/package/esmock