如何使用 Mocha 测试嵌套的 ES6 生成器?

How Do I Test nested ES6 Generators using Mocha?

我正在尝试使用 co-mocha 来测试我的 koa 应用程序中的一些嵌套生成器功能。 class 在 运行 时工作得很好,但是当我尝试测试功能时,我无法在我的测试中将嵌套生成器设置为 运行。

Class 正在测试中:

import Promise from 'bluebird'

class FooService {
  _doAsync(){
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve({
          foo: 'FOO'
        })
      }, 500)
    })
  }

  create(){
    console.log('This never gets logged')
    let self = this
    return function*(){
      console.log(`This doesn't either`)
      return yield self._doAsync()
    }
  }
}
export default new FooService()

测试文件

import fooService '../services/foo-service'
import Chai from 'chai'
let expect = Chai.expect

describe('Testing generators', () => {
  it('Should just work', function *(){
    console.log('This log never happens')
    let result = yield fooService.create()
    expect(result).to.equal({foo: 'FOO'})
  })
})

我 运行宁摩卡 --require co-mocha 和 Node 4.2.6

虽然测试完成 w/o 错误,但上面的控制台的 NONE 会被记录下来,所以我很确定实际的测试生成器根本不会 运行ning。

如果我尝试使用 npm 包,mocha-generators 而不是,当我从测试生成器内部获取日志时,从服务上的 create() 方法返回的底层生成器永远不会触发。 .

我做错了什么??

没有 mocha-generatorsit 回调 returns 一个不会被任何人 运行 的生成器。您需要手动将其包装在 co 中,以便 mocha 收到承诺。

使用 mocha-generators,你的生成器被执行但产生了一个生成器函数。这不是预期的,你应该做出承诺。您需要自己调用 create() 调用 returns 的生成器函数,然后您不应该 yield 生成器本身,而是通过 yield*:

let result = yield* fooService.create()();