2015-04-01 9 views
32

Sto scrivendo una libreria JavaScript che utilizza le nuove promesse di es6. Posso testare la libreria in Firefox perché le promesse sono definite. Tuttavia, quando provo a testare il mio codice con Karma e PhantomJS, ottengo l'errore Can't find variable: Promise.. Sto indovinando questo perché il browser PhantomJS non supporta ancora le promesse di es6.Karma, PhantomJS ed es6 Promises

Come posso configurare Karma per inserire il polyfill per le promesse?

risposta

0

Questo thread dovrebbe aiutarti. Secondo questo, sembra che dovresti provare a usare PhantomJS2 con ES6. Puoi anche dare un'occhiata al progetto this, che tratta l'argomento vicino al tuo.

spero che possa aiutare a

+3

Il test rapido mostra che PhantomJS 2.0.1-dev non supporta Promises. –

63

Si può tirare in polyfill Babel semplicemente installando Babel Polyfill:

npm install --save-dev babel-polyfill 

e quindi includere il file polyfill davanti ai vostri file di origine e di prova all'interno della sezione files di il vostro 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 
], 

Se non si sa che tutti i browser di destinazione supportano Promi ses, probabilmente vorrai applicare questo polyfill anche alla build rilasciata.

Se ti senti davvero avventuroso, puoi utilizzare Browserify per caricare i file per rendere i tuoi test più modulari e quindi utilizzare Babelify per traspolare ES6 in ES5. Ho creato un sample project with these and a working test involving a Promise (running on PhantomJS2) for reference.

+0

Sto avendo un problema simile ma dopo aver incluso il polyfill, il Promise non sembra mai risolversi, ecco un esempio: https://gist.github.com/Kikketer/1646eccdaff76944b358 Chiunque ha idea del perchè la Promessa non avrebbe mai funzionato ' .poi' ? – Chris

+0

@Chris il tuo problema non sembra affatto correlato. Non ho potuto eseguire il tuo succo, ma sembra che il tuo problema sia probabilmente correlato a Angular. Non utilizzare il polyfill Promise con Angular: è necessario utilizzare l'implementazione $ q incorporata (altrimenti non funzionerà con il ciclo digest). Se vuoi costruire una promessa risolta usa '$ q.quando (some_object)'. Hai davvero bisogno di aprire una nuova domanda su SO, ma pubblica qui il link e darò un'occhiata. – spikeheap

+0

@spikeheap Sì, sono passato a $ q in tutta l'app e ha funzionato. Grazie per averlo visto. – Chris

0

È possibile utilizzare karma-babel-preprocessor per i file che utilizzano le funzionalità ES6. Installarlo con

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

e quindi aggiungere specificare quali file devono essere pre-elaborati si karma.conf:

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

Purtroppo questo non funziona. Stavo già usando il 'babel-preprocessore' e Karma non riusciva a trovare la funzione' Promise.resolve() '. Il 'babel-polyfill' ha risolto il problema per me. – Jelle

10

Per Babel 6, abbiamo bisogno di installare babel-polyfill per sostenere promessa.

 
npm install --save-dev babel-polyfill 

e aggiungere una riga nel karma.conf.js all'interno della files sezione

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

E 'ben documentato in https://github.com/babel/karma-babel-preprocessor#polyfill

0

come correttamente rilevato dall'autore non è in grado di riconoscere promessa ES6. Per caricarlo, il modulo es6-promise può essere caricato con l'aiuto di webpack.ProvidePlugin e configurandolo all'interno di plugin array di webpack.

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

Questo sembra funzionare per me!