2015-04-27 7 views
6

Sto tentando di testare una promessa con Jest CLI, questo codice viene eseguito come dovrebbe quando viene eseguito nel browser. Comunque voglio iniziare a scrivere test per questo.Come posso far funzionare Promises quando uso Jest CLI?

class ListCollection { 
    constructor() { 
    this.items = new Array(); 
    } 

    addItem(string) { 
    const addItemPromise = new Promise(
     function (resolve, reject) { 
     // set up async getting like a XMLHttpRequest 
     setTimeout(() => { 
      this.items.push(string); 
      resolve(string); 
     }.bind(this), 2000); 
     }.bind(this) 
    ); 
    return addItemPromise; 
    } 
} 

Attualmente sto cercando di ottenere questo test di base per funzionare. Sto testando con pit come da documentation which links to jasmine-pit.

jest.dontMock('../collections'); 

import Collection  from '../collections'; 

describe("Collection",() => { 
    let collection; 

    beforeEach(() => { 
     collection = new Collection(); 
    }); 

    describe("Adding an item",() => { 
     pit('Spec 1', function() { 
      return collection.addItem("Hello World").then(function (string) { 
       expect(string).toBe("Hello World"); 
      }); 
     }); 
    }); 
}) 

Quando eseguo i miei test con babel-node ./node_modules/.bin/jest, la prova di cui sopra non riesce con questa traccia come è impilare. In particolare ottengo Promise is not defined.

Rollos-Mac-Pro:react-boilerplate Rollo$ babel-node ./node_modules/.bin/jest 
Using Jest CLI v0.4.0 
FAIL app/collections/__tests__/collectionTests.js 
ReferenceError: /Users/Rollo/react-boilerplate/app/collections/__tests__/collectionTests.js: /Users/Rollo/react-boilerplate/app/collections/collections.js: **Promise is not defined** 
    at ListCollection.addItem (/Users/Rollo/react-boilerplate/app/collections/collections.js:24:34) 
    at /Users/Rollo/react-boilerplate/app/collections/collections.js:48:12 
    at Object.runContentWithLocalBindings (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/lib/utils.js:361:17) 
    at Loader._execModule (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:250:9) 
    at Loader.requireModule (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:916:12) 
    at Loader.requireModuleOrMock (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:937:17) 
    at /Users/Rollo/react-boilerplate/app/collections/__tests__/collectionTests.js:7:34 
    at Object.runContentWithLocalBindings (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/lib/utils.js:361:17) 
    at Loader._execModule (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:250:9) 
    at Loader.requireModule (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/HasteModuleLoader/HasteModuleLoader.js:916:12) 
    at jasmineTestRunner (/Users/Rollo/react-boilerplate/node_modules/jest-cli/src/jasmineTestRunner/jasmineTestRunner.js:242:16) 
    at /Users/Rollo/react-boilerplate/node_modules/jest-cli/src/TestRunner.js:371:12 
    at _fulfilled (/Users/Rollo/react-boilerplate/node_modules/jest-cli/node_modules/q/q.js:798:54) 
    at self.promiseDispatch.done (/Users/Rollo/react-boilerplate/node_modules/jest-cli/node_modules/q/q.js:827:30) 
    at Promise.promise.promiseDispatch (/Users/Rollo/react-boilerplate/node_modules/jest-cli/node_modules/q/q.js:760:13) 
    at /Users/Rollo/react-boilerplate/node_modules/jest-cli/node_modules/q/q.js:574:44 
    at flush (/Users/Rollo/react-boilerplate/node_modules/jest-cli/node_modules/q/q.js:108:17) 
    at /Users/Rollo/react-boilerplate/node_modules/jest-cli/src/lib/FakeTimers.js:325:7 
    at process._tickCallback (node.js:448:13) 

Non so come risolvere il problema. La versione del nodo che sto usando deve essere 0.10.x, altrimenti non posso eseguire la Jest-CLI. Ma il nodo versione 0.10.x non ha promesse. Inoltre, non capisco come Jest-CLI funzioni con le mie classi e sintassi ES6 ma non riconosca Promises.

Qualche idea su come ottenere promesse di lavoro nel mio setup?

EDIT

ho aggiunto la es6-promise polyfill alla parte superiore del mio file di prova e contrassegnato non essere preso in giro. Questo fornisce una correzione adeguata.

jest.dontMock('es6-promise'); 
require('es6-promise').polyfill(); 
+0

Aggiornamento nodo lavorato per me. La versione 12.7 del nodo risolveva questo problema – singh1469

risposta

1

L'uscita menziona babel-node, il che significa che babel è in esecuzione come un gancio richiedere, compilare l'ES6 per ES5 al volo. È necessario includere uno spessore per promesse native ed esporlo come global.Promise. Mi raccomando questo: https://github.com/jakearchibald/es6-promise

+0

In realtà ottengo la stessa traccia di stack quando si utilizza solo il nodo vanilla. Quindi, se babel converte ES6 in ES5, perché le promesse non sono polifinite? Grazie per il collegamento, ho intenzione di rilasciarlo nel mio file di test e vedere se risolve il mio problema. Aggiornerà :-) – Rollo

+0

Babel può dire di fornire polyfill per le funzionalità di ES6 come 'Promise'. Avevo l'impressione che 'babel-node' lo includesse di default, ma non ne sono sicuro. –

+0

Anche io sono sotto quell'impressione, tuttavia si dice che Jest e Jasmine facciano un sacco di cose strane sono runtime che potrebbero rovinare tutto. – Rollo