如何从 ES5 测试框架测试 ES6 生成器函数

How to test an ES6 generator function from an ES5 test framework

给定一个带有生成器函数的 ES6 class,你如何运行 ES5 代码中的生成器函数:

class GeneratorClass {

    constructor() {
        this.ary = [1, 2, 3];
    }

    *[Symbol.iterator]() {
        for (let el of this.ary) {
            yield el;
        }
    }

}

// This runs fine transcompiled (traceur)
var iterableObj = new GeneratorClass();
for (let el of iterableObj) {
    console.log(el);
}

来自 ES5 测试框架:

TestCase('GeneratorClassTest', {
    setUp: function () {
        console.log('in setup');
        var iterableObj = new GeneratorClass();
        for (var el in this.iterableObj) {
            console.log(el);
        }
    },

    testConstructor: function() {

    }  
});

这不会引发任何错误,将 运行 设置函数,但是不会遍历数组。

如果您只是从仅支持 ES5 的运行时需要 ES6 模块,则不能这样做。

但是如果你使用 babel or traceur and then requiring your compiled module - you can test your generator in ES5 runtime. Just not use for of loop, create iteratorObj using Symbol.iterator method, and the use when loop and next 迭代器方法将你的 ES6 模块编译成 ES5。

以你的例子为例:

TestCase('GeneratorClassTest', {
    setUp: function () {
        console.log('in setup');
        var generator = new GeneratorClass();
        var next, iterableObj = generator[Symbol.iterator]();

        while ((next = iterableObj.next()) && !next.done) {
            console.log(next.value);
        }
    },

    testConstructor: function() {

    }
});