如何使用摩卡测试嵌套的 ES6 生成器

How Do I Test nested ES6 Generators using Mocha?

本文关键字:ES6 嵌套 何使用 摩卡 测试      更新时间:2023-09-26

我正在尝试使用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'})
  })
})

我正在运行带有 --require co-mocha 和节点 4.2.6 的摩卡

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

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

我做错了什么??

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

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

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