【问题标题】:How Do I Test nested ES6 Generators using Mocha?如何使用 Mocha 测试嵌套的 ES6 生成器?
【发布时间】:2016-05-18 18:31:03
【问题描述】:

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

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

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

我做错了什么??

【问题讨论】:

  • 你可能想yield* fooService.create()()
  • 永远不要导出类实例!要么导出类,要么不使用class 语法而是创建一个对象字面量。
  • @Bergi 当该行所在的生成器一开始似乎从未运行时,更改该行将如何改变任何东西(在co-mocha 的情况下)?
  • @Bergi 您的行修改与mocha-generators 库一起使用!谢谢!请添加它作为答案?顺便说一句,为什么我们应该“从不”导出类实例的断言?我的印象是,在单例的情况下,由于require 的内置缓存,这种模式工作得很好?
  • @RavenHursT 主要问题是,如果您要导出一个类单例,您还不如只导出一个对象。使用类语法你什么也得不到。你可以很容易地export default function create(){} 或者如果你有多个功能,export function create(){}

标签: javascript mocha.js ecmascript-6 generator koa


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-09-24
    • 2016-11-08
    • 2017-03-06
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2021-01-23
    相关资源
    最近更新 更多