Подтвердить что ты не робот

Karma, PhantomJS и es6 Promises

Я пишу библиотеку JavaScript, которая использует новый es6 promises. Я могу протестировать библиотеку в Firefox, потому что promises определены. Однако, когда я пытаюсь проверить свой код с помощью Karma и PhantomJS, я получаю сообщение об ошибке Can't find variable: Promise.. Я предполагаю, что это потому, что браузер PhantomJS не поддерживает es6 promises.

Как настроить Karma для ввода polyfill для promises?

4b9b3361

Ответ 1

Вы можете вытащить Babel polyfill, просто установив Babel Polyfill:

npm install --save-dev babel-polyfill

а затем добавьте файл polyfill перед исходным кодом и проверьте файлы в разделе files вашего karma.conf.js:

files: [
  'node_modules/babel-polyfill/dist/polyfill.js',
  'index.js',   //could be /src/**/*.js
  'index.spec.js' //could be /test/**/*.spec.js
],

Если вы не знаете, что все целевые браузеры поддерживают Promises, вы, вероятно, захотите применить этот polyfill к своей выпущенной версии тоже.

Если вы чувствуете себя очень предприимчивым, вы можете использовать Browserify, чтобы вытащить файлы, чтобы сделать ваше тестирование более модульным, а затем использовать Babelify для пересылки ES6 на ES5. Я создал проект с этими и рабочим тестом с использованием Promise (работает на PhantomJS2) для справки.

Ответ 2

Для Babel 6 нам нужно установить babel-polyfill, чтобы поддержать обещание.

npm install --save-dev babel-polyfill

и добавьте строку в karma.conf.js в разделе files

files: [
  'node_modules/babel-polyfill/dist/polyfill.js',
  ....
]

Это хорошо документировано в https://github.com/babel/karma-babel-preprocessor#polyfill

Ответ 4

Вы можете использовать karma-babel-preprocessor для файлов, которые используют функции ES6. Установите его с помощью

npm install --save-dev karma-babel-preprocessor

а затем укажите, какие файлы должны быть предварительно обработаны вами karma.conf:

preprocessors: {
      "src/**/*.js": ["babel"],
      "test/**/*.js": ["babel"]
    },

Ответ 5

как правильно указал автор, он не может признать обещание es6. Чтобы загрузить его, модуль es6-prom можно загрузить с помощью webpack.ProvidePlugin и настроить его внутри массива плагинов webpack.

plugins: [
        new webpack.ProvidePlugin({
            'Promise': 'es6-promise'
        })
    ]

Кажется, это работает для меня!