我试图从谷歌传播的决策表中动态创建测试,如下所示:
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
。
有没有办法完成我在这里尝试做的事情?
答案 0 :(得分:1)
问题是在创建规则之前记录了描述规则。
是的,这就是Mocha的设计运作方式。事件的顺序是:
您的外部describe
被调用。它立即调用它的匿名函数。
调用before
。这将注册传递给它的回调,用于 future 执行。
您的for rule in rules
循环已执行。
执行传递给before
的回调。请注意,此时调用describe
或it
太晚。 (Mocha可以接受这些电话,在某些情况下它可能会做你想要的,但它确实是未定义的行为。如果它有效,那只是运气。)
一般规则是传递给describe
的回调会立即执行。传递给挂钩(before
,beforeAll
等)或测试(it
)的回调稍后执行。 (我有answer here进入执行顺序的细节。)
我没有看到你想做什么的简单解决方案。您正在尝试生成测试,这通常不是问题,只要它是同步。 (我已经做了很多次,例如使用Node的同步fs
调用来读取一组文件。)没有规定异步执行它。我希望你必须use mocha programmatically才能做到这一点。