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

Javascript 如何使用Mocha测试嵌套ES6生成器?,javascript,mocha.js,ecmascript-6,generator,koa,Javascript,Mocha.js,Ecmascript 6,Generator,Koa,我正在尝试使用co mocha测试我的koa应用程序中的一些嵌套生成器功能。该类在运行时工作正常,但当我尝试测试功能时,无法在测试中运行嵌套生成器 正在测试的类: import Promise from 'bluebird' class FooService { _doAsync(){ return new Promise((resolve) => { setTimeout(() => { resolve({ foo: '

我正在尝试使用
co mocha
测试我的
koa
应用程序中的一些嵌套生成器功能。该类在运行时工作正常,但当我尝试测试功能时,无法在测试中运行嵌套生成器

正在测试的类:

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'})
  })
})
我正在运行mocha w/
——需要co-mocha
和Node 4.2.6

虽然测试完成了w/o错误,但是上面的控制台没有一个被记录下来,所以我很确定实际的测试生成器根本没有运行过

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


我做错了什么?

如果没有
mocha生成器
it
回调将返回一个任何人都不会运行的生成器。您需要手动将其包装在
co
中,这样摩卡就可以收到承诺

使用
摩卡生成器
,可以执行生成器,但会生成生成器函数。这是意料之外的,你应该做出承诺。您需要调用
create()
调用返回的生成器函数,然后您不应该
生成生成器本身,而应该通过以下方式委托给它:


您可能希望
yield*fooService.create()()
永远不要导出类实例!要么导出类,要么不要使用
class
语法,而是创建一个对象文本。@Bergi当该行所在的生成器运行时,更改该行将如何改变任何事情(在
co mocha
的情况下),从未运行过?@Bergi您的线路修改与
mocha generators
库一起工作!非常感谢。请添加它作为答案?另一方面,为什么要断言我们不应该“永远”导出类实例?我的印象是,在单例情况下,由于
require
的内置缓存?@RavenHursT,这种模式工作得相当好。主要问题是,如果您要导出一个类单例,还不如只导出一个对象。使用类语法将一无所获。您可以同样轻松地导出默认函数create(){}
或者如果您有多个函数,
导出函数create(){}
let result = yield* fooService.create()();