2016-07-26 69 views
2

我正在尝试使用for-loop动态生成测试,但要从异步任务中获取要生成的测试的数量。这里是我的代码:在'描述'之前在摩卡中运行异步代码

var noOfTestsToRun; 

before(function() { 
    return someAsyncTask().then(function(result) { 
     noOfTestsToRun = result; 
    }) 
}); 

describe('My Test Suite', function() { 
    for (var i = 0; i < noOfTestsToRun; i++) { 
     it('Test ' + i, function() { 
      //... 
     }); 
    } 
}); 

然而,noOfTestsToRun = result似乎并不当它到达for循环执行。

我想知道是否有解决这类问题的方法。谢谢。

+0

迈赫迪,上面的链接是有关运行的异步任务前所有的“它”,我的是关于“描述” – batluck

+0

路易斯之前运行的异步任务,它的工作原理,非常感谢你。但是还有一个问题,如果我想要在另一个describe中的describe之前执行一些异步任务呢? – batluck

+0

先执行异步代码,然后定义所有'mocha'的东西,比如'before','describe'和all。 – MarcoL

回答

0

done回调给您的before函数。

var noOfTestsToRun; 

before(function(done) { 
    return someAsyncTask().then(function(result) { 
     noOfTestsToRun = result; 

     // Complete the async stuff 
     done(); 
    }) 
}); 

describe('My Test Suite', function() { 
    for (var i = 0; i < noOfTestsToRun; i++) { 
     it('Test ' + i, function() { 
      //... 
     }); 
    } 
}); 

当你的异步任务完成并done()被调用时,我们告诉摩卡是异步的东西完成,它可以在移动的期望。

UPDATE

所以,你的目标是让摩卡运行动态测试。

你可以通过一些破解来实现。您将需要一个it块来强制执行before。在之前的版本中,您可以根据异步结果动态生成it测试。

before(function() { 
    return someAsyncTask().then(function(result) { 
     describe('My Test Suite (dynamic)', function() { 
      for (var i = 0; i < result; i++) { 
       it('Test ' + i, function() { 
        // ... 
       }); 
      } 
     }); 
    }); 
}); 

it('should force before to execute', function() { 
    console.log('Hack to force before to execute'); 
}); 

Working pen

+0

感谢您的快速回复。但它不起作用。 我用'Promise.resolve(1)'替换了'someAsyncTask()'并试用了你的解决方案。 'noOfTestsToRun'在到达'for'循环时仍未定义 – batluck

+1

试试这个http://stackoverflow.com/questions/22465431/how-can-i-dynamically-generate-test-cases-in-javascript-node – Prashant

+0

上面的解决方案为'forEach'生成测试的常量值为'['nl','fr','de']'。我需要一个异步任务的价值。它不能解决我的问题。 – batluck