По словам Джона-Дэвида Далтона , создателя пакета @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
по умолчанию, поэтому указывать его необязательно.