使用Jest CLI时如何获得承诺?

我试图用Jest CLI来testing一个承诺,这个代码在浏览器中运行时应该执行。 不过,我想开始为它编写testing。

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; } } 

目前我正试图让这个非常基本的testing工作。 我按照与茉莉花坑相关的文件进行testing。

 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"); }); }); }); }) 

当我用babel-node ./node_modules/.bin/jest运行我的testing时,上面的testing失败了,因为它是堆栈跟踪。 值得注意的是我得到的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) 

我不知道如何解决这个问题。 我使用的节点版本必须是0.10.x,否则我不能运行Jest-CLI。 但是,节点版本0.10.x没有承诺。 我也不明白Jest-CLI如何与我的ES6类和语法工作,但不会承认承诺。

任何想法如何得到承诺在我的设置工作?

编辑

我已经将es6-promise添加到我的testing文件的顶部,并标记为不被嘲笑。 这提供了一个适当的修复。

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

输出提到了babel-node ,这意味着babel作为一个需要的钩子运行,将你的ES6编译为ES5。 你需要包括一个本地承诺的垫片,并将其暴露为global.Promise 。 我推荐这个: https : //github.com/jakearchibald/es6-promise

用babel-jestreplacejest scriptPreprocessor应该可以很好地解决所有的es6可比性问题

https://babeljs.io/docs/using-babel/#jest