使用“return”和“yield”对生成器进行单元测试

Unit testing generators with `return` and `yield`

给定这个函数

function* backflip(query) {
  return yield 123;
}

还有这个测试

describe('backflip', () =>
  it('should do that ^', () =>
    let handlerInstance = handler();
    expect(handlerInstance.next().value).to.equal(123);
    expect(handlerInstance.next().done).to.equal(true);
  );
);

伊斯坦布尔,应该说所有分支都被覆盖了,但实际上这覆盖了 4 个中的 3 个。删除 return 解决了这个问题。

对于上下文,Babel 将其编译为

"use strict";

var _marked = [backflip].map(regeneratorRuntime.mark);

function backflip(query) {
  return regeneratorRuntime.wrap(function backflip$(_context) {
    while (1) {
      switch (_context.prev = _context.next) {
        case 0:
          _context.next = 2;
          return 123;

        case 2:
          return _context.abrupt("return", _context.sent);

        case 3:
        case "end":
          return _context.stop();
      }
    }
  }, _marked[0], this);
}

来自控制台的快速示例:

var g = function* backflip(query) {
    yield 123; return 0;
};
undefined
var a = g();
undefined
a.next()
Object {value: 123, done: false}
a.next()
Object {value: 0, done: true}
a.next()
Object {value: undefined, done: true}

发电机还有 1 个状态。

这是一个正在解决的错误。该分支目前无法测试。