循环描述在mocha中基于在块之前的设置

时间:2014-10-06 15:13:04

标签: mocha

我试图从谷歌传播的决策表中动态创建测试,如下所示:

describe "Dynamic test", ->
    rules = [1] # add a dummy element to see something in logs
    before (done) ->
        Tabletop.init(
            key: 'the google spreadsheet key'
            callback: (data, tabletop) ->
                decisionTable = createTable(data)
                rules = extractRulesFromDesicionTable(decisionTable)
                console.log 'rules created'
                done()
            simpleSheet: true)


    for rule in rules
        do (rule) ->
            describe rule.name, ->
                console.log "describing rule"
                it 'should be nice', ->
                    true.should.be.ok

问题是在describe rule之前记录rules created

有没有办法完成我在这里尝试做的事情?

1 个答案:

答案 0 :(得分:1)

  

问题是在创建规则之前记录了描述规则。

是的,这就是Mocha的设计运作方式。事件的顺序是:

  1. 您的外部describe被调用。它立即调用它的匿名函数。

  2. 调用before。这将注册传递给它的回调,用于 future 执行。

  3. 您的for rule in rules循环已执行。

  4. 执行传递给before的回调。请注意,此时调用describeit 太晚。 (Mocha可以接受这些电话,在某些情况下它可能会做你想要的,但它确实是未定义的行为。如果它有效,那只是运气。)

  5. 一般规则是传递给describe的回调会立即执行。传递给挂钩(beforebeforeAll等)或测试(it)的回调稍后执行。 (我有answer here进入执行顺序的细节。)

    我没有看到你想做什么的简单解决方案。您正在尝试生成测试,这通常不是问题,只要它是同步。 (我已经做了很多次,例如使用Node的同步fs调用来读取一组文件。)没有规定异步执行它。我希望你必须use mocha programmatically才能做到这一点。