2015-04-01 16 views
32

Ich schreibe eine JavaScript-Bibliothek, die die neuen Versprechen es6 verwendet. Ich kann die Bibliothek in Firefox testen, weil Versprechen definiert sind. Wenn ich jedoch versuche, meinen Code mit Karma und PhantomJS zu testen, erhalte ich den Fehler Can't find variable: Promise.. Ich vermute, das liegt daran, dass der PhantomJS-Browser ES6-Versprechen noch nicht unterstützt.Karma, PhantomJS und es6 Promises

Wie kann ich Karma konfigurieren, um die Polyfill für Versprechungen einzubringen?

Antwort

0

Diese sollte Ihnen helfen. Dementsprechend scheint es, dass Sie versuchen sollten, PhantomJS2 mit ES6 zu verwenden. Sie können auch einen Blick auf this Projekt werfen, die zu einem nahestehenden Thema behandeln.

Ich hoffe, dass es Ihnen

helfen können
+3

Schnelltest zeigt, dass PhantomJS 2.0.1-dev Promises nicht unterstützt. –

63

Sie einfach im Babel polyfill ziehen Babel Polyfill Installation:

npm install --save-dev babel-polyfill 

und schließen Sie dann die polyfill Datei vor Ihrer Quelle und Testdateien im files Abschnitt Ihre 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 
], 

Es sei denn, Sie wissen, dass alle Ihre Ziel Browser unterstützen Promi Vielleicht möchten Sie dieses Polyfill auch auf Ihren freigegebenen Build anwenden.

Wenn Sie wirklich abenteuerlustig sind, können Sie mit Browserify Dateien einlesen, um Ihre Tests modularer zu machen, und dann Babelify verwenden, um ES6 nach ES5 zu transponieren. Ich habe eine sample project with these and a working test involving a Promise (running on PhantomJS2) for reference erstellt.

+0

Ich habe ein ähnliches Problem, aber nach der Einbeziehung der Polyfill, scheint das Versprechen nie zu lösen, hier ist ein Kern: https://gist.github.com/Kikketer/1646eccdaff76944b358 Jeder hat eine Ahnung, warum das Versprechen würde nie laufen es ist ' .dann' ? – Chris

+0

@Chris Ihr Problem sieht nicht alle verwandten aus. Ich konnte deinen Kern nicht ausführen, aber es sieht so aus, als ob dein Problem wahrscheinlich mit Angular zusammenhängt. Verwenden Sie nicht das Promise-Polyfill mit Angular - Sie müssen die integrierte $ q-Implementierung verwenden (andernfalls wird es nicht mit dem Digest-Zyklus funktionieren). Wenn Sie ein aufgelöstes Versprechen erstellen möchten, verwenden Sie '$ q.when (some_object)'. Sie müssen wirklich eine neue Frage zu SO öffnen, aber posten Sie den Link hier und ich werde einen Blick darauf werfen. – spikeheap

+0

@spikeheap ja ich wechselte in der ganzen App zu $ ​​q und es funktionierte. Danke, dass du es angeschaut hast. – Chris

0

Sie können karma-babel-preprocessor für Dateien verwenden, die ES6-Funktionen verwenden. Installieren Sie es mit

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

und fügen Sie dann angeben, welche Dateien Sie karma.conf vorverarbeitet werden sollten:

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

Leider funktioniert das nicht. Ich benutzte bereits den 'babel-preprocessor' und Karma konnte die 'Promise.resolve()' Funktion nicht finden. Das 'babel-polyfill' hat das Problem für mich behoben. – Jelle

10

Für Babel 6, müssen wir babel-polyfill installieren Versprechen zu unterstützen.

 
npm install --save-dev babel-polyfill 

und eine Linie in karma.conf.js im files Abschnitt hinzufügen

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

Es ist gut in https://github.com/babel/karma-babel-preprocessor#polyfill

dokumentiert
0

wie wies richtig vom Autor heraus, dass es nicht in der Lage ist es6 Versprechen zu erkennen. Um es zu laden, kann das es6-promise-Modul mit Hilfe von webpack.ProvidePlugin geladen und im Plugins-Array des Webpacks konfiguriert werden.

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

Das scheint für mich zu arbeiten!

Verwandte Themen