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

时间:2016-02-08 22:41:41

标签: javascript mocha ecmascript-6 generator koa

我正在尝试使用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 / --require co-mocha和Node 4.2.6

虽然测试完成没有错误,但上面的控制台没有记录,所以我很确定实际的测试生成器根本不会运行。

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

我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

使用mocha-generators,您的生成器将被执行,但会产生生成器函数。这不是预期的,你应该产生承诺。您需要调用create()调用自己返回的生成器函数,然后您不应yield生成器本身,而应通过yield*委托给它:

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