Заглушка функция из модуля ES6 без бабель - PullRequest
0 голосов
/ 08 июня 2018

Я использую AVA + sinon для построения моего модульного теста.Так как мне нужны модули ES6 и я не люблю babel, я использую файлы mjs по всему проекту, включая тестовые файлы.Я использую аргумент "--experimental-modules", чтобы запустить свой проект, и использую пакет "esm" в тесте.Вот мой ava config и тестовый код.

  "ava": {
    "require": [
      "esm"
    ],
    "babel": false,
    "extensions": [
      "mjs"
    ]
  },


// test.mjs
import test from 'ava';
import sinon from 'sinon';
import { receiver } from '../src/receiver';
import * as factory from '../src/factory';

test('pipeline get called', async t => {
  const stub_factory = sinon.stub(factory, 'backbone_factory');
  t.pass();
});

Но я получаю сообщение об ошибке:

  TypeError {
    message: 'ES Modules cannot be stubbed',
  }

Как я могу заглушить модуль ES6 без babel?

1 Ответ

0 голосов
/ 08 июня 2018

По словам Джона-Дэвида Далтона , создателя пакета @esm, возможно только изменить пространства имен файлов *.js - *.mjs файлы заблокированы .

Это означает, что Sinon (и все другое программное обеспечение) не может заглушить эти модули - именно так, как указано в сообщении об ошибке.Вы можете попробовать использовать link seam , используя proxyquire или rewire, что означает, что приведенный выше тест будет выглядеть примерно так:

// assuming that `receiver` uses `factory` internally

// comment out the import - we'll use proxyquire
// import * as factory from '../src/factory';
// import { receiver } from '../src/receiver';

const factory = { backbone_factory: sinon.stub() };
const receiver = proxyquire('../src/receiver', { './factory' : factory });

Я не уверен на 100% в этомработает, хотя и по причинам, указанным выше, но стоит попробовать.


Старый ответ - действителен только для *.js файлов (не *.mjs).

Вам нужно передать параметр esm, который позволит вам иметь изменяемые пространства имен.Модули ES не являются изменяемыми по умолчанию, что означает, что Sinon не может выполнять zilch.

Опция, называемая cjs.mutableNamespace, описана в README и изменит время выполненияУзел, позволяющий вам изменять экспорт.

Способ включения опции зависит от того, как вы загружаете esm, но в файле readme говорится: // Set options as a parameter, environment variable, or rc file.

Поскольку вы не загружаетеМодуль самостоятельно, я предполагаю, что переменные окружения или rc-файл - это только два ваших варианта.Заполнение json в переменных env может быть грязным, поэтому я бы предложил вставить следующее в файл с именем .esmrc.json:

{
  "cjs": { 
    "mutableNamespace": "true"
  }
}

Я никогда не передавал параметры esm сам, так что не знаю, так ли этовыполняется без изменений, и приведенный выше код не может быть запущен сам по себе, что означает, что я не могу проверить его в вашем случае, но я думаю, что это должно быть довольно правильно.

edit: опция mutableNamespaceпо умолчанию, поэтому указывать его необязательно.

...