2015-04-27 10 views
6

Próbuję przetestować obietnicę za pomocą polecenia Jest CLI, kod ten wykonuje się tak, jak powinien, gdy jest uruchamiany w przeglądarce. Jednak chcę zacząć pisać testy na to.Jak uzyskać obietnice do pracy przy użyciu 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; 
    } 
} 

Obecnie staram się wykonać ten bardzo prosty test. Testuję pod numerem pit zgodnie z 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"); 
      }); 
     }); 
    }); 
}) 

Gdy uruchomię moich testów z babel-node ./node_modules/.bin/jest, test nie powiedzie się powyżej z tym, jak to jest ślad stosu. W szczególności dostaję 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) 

Nie wiem, jak to naprawić. Wersja węzła, której używam, musi mieć wartość 0.10.x, w przeciwnym razie nie będę mógł uruchomić polecenia Jest-CLI. Ale wersja 0.10.x węzła nie ma obietnic. Nie rozumiem też, w jaki sposób Jest-CLI działa z moimi klasami ES6 i składnią, ale nie rozpoznaje obietnic.

Każdy pomysł, jak uzyskać obietnicę pracy w mojej konfiguracji?

EDIT

Dodałem es6-promise PolyFill na szczycie mojej pliku testowego i oflagowane nie być wyśmiewany. Zapewnia to odpowiednią poprawkę.

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

Modernizacja węzła pracował dla mnie. Węzeł w wersji 12.7 rozwiązał ten problem – singh1469

Odpowiedz

1

Wyjście wspomina babel-node, co oznacza, że ​​babel działa jak hak wymagać, kompilacji ES6 do ES5 w locie. Musisz podać podkładkę dla natywnych obietnic i wystawić go jako global.Promise. Polecam ten: https://github.com/jakearchibald/es6-promise

+0

W rzeczywistości uzyskuję ten sam ślad stosu, gdy tylko używam węzła waniliowego. Więc jeśli babel konwertuje ES6 na ES5, dlaczego obietnice nie są polyfilled? Dzięki za link, przekażę go do mojego pliku testowego i zobaczę, czy to naprawi mój problem. Aktualizacja :-) – Rollo

+0

Babel może zostać poinformowany o tym, że będzie oferować polyfills dla funkcji ES6, takich jak 'Obietnica'. Miałem wrażenie, że domyślnie "węzeł babel" to uwzględnił, ale nie jestem pewien. –

+0

Jestem również pod tym wrażeniem, jednak Mówi się, że Jest i Jasmine robią wiele dziwnych rzeczy, które są w stanie uruchomić. – Rollo