2015-04-01 57 views
32

我在写一个使用新的es6 promise的JavaScript库。我可以在Firefox中测试库,因为承诺是定义的。但是,当我尝试使用Karma和PhantomJS测试我的代码时,出现错误Can't find variable: Promise.。我猜这是因为PhantomJS浏览器还不支持es6承诺。Karma,PhantomJS和es6 Promises

我如何配置Karma为承诺引入polyfill?

回答

0

This thread should help you。据它说,你似乎应该尝试与ES6一起使用PhantomJS2。 您也可以看看this项目,该项目对待比您的近的主题。

我希望它可以帮助你

+3

快速测试显示PhantomJS 2.0.1-dev不支持Promises。 – 2015-04-01 12:59:20

63

您可以在通天填充工具拉,只需安装Babel Polyfill

npm install --save-dev babel-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 
], 

除非您知道所有目标浏览器都支持Promi ses,你可能也想把这个polyfill应用到你发布的版本上。

如果您感觉真的很冒险,可以使用Browserify将文件拉入以使测试更加模块化,然后使用Babelify将ES6转换为ES5。我创建了一个sample project with these and a working test involving a Promise (running on PhantomJS2) for reference

+0

我有一个类似的问题,但包括polyfill后,承诺似乎永远不会解决,这是一个要点:https://gist.github.com/Kikketer/1646eccdaff76944b358任何人都有一个线索,为什么承诺永远不会运行' 。然后' ? – Chris 2016-02-19 17:47:46

+0

@Chris你的问题没有看全部相关。我无法运行你的要点,但看起来你的问题可能与Angular有关。不要将Promise polyfill与Angular一起使用 - 您需要使用内置的$ q实现(否则它不适用于摘要循环)。如果你想用'$ q.when(some_object)'来构建一个已解决的promise。你真的需要在SO上打开一个新的问题,但在这里发布链接,我会看看。 – spikeheap 2016-02-20 18:44:49

+0

@spikeheap是的我在整个应用程序切换到$ q,它的工作。感谢您的关注。 – Chris 2016-02-21 22:05:01

0

对于使用ES6功能的文件,您可以使用karma-babel-preprocessor。与

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

安装它,然后添加指定哪些文件应该进行预处理你karma.conf

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

不幸的是,这不起作用。我已经使用'babel-preprocessor',Karma找不到'Promise.resolve()'函数。 'babel-polyfill'为我解决了这个问题。 – Jelle 2017-01-19 13:35:09

0

为正确的作者是不能够识别器ES6承诺指出。为了加载它,es6-promise模块可以在webpack.ProvidePlugin的帮助下加载并在webpack的插件数组中进行配置。

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

这似乎适合我!