Как правильно замокать es6 imports



Т.к. всё что импортируется доступно только для чтения, все стандартные способы импорта, которые предоставляют 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


Сообщество: AWS

Комментариев(0)


Всего: 0 комментариев на 0 страницах

Ваш комментарий будет анонимным. Чтобы оставить не анонимный комментарий, пожалуйста, зарегистрируйтесь



Сообщества