摩卡(mocha)-before()没有按预期执行'before'吗?

Mop*_*ath 3 mocha.js node.js chai

在mocha + chai测试代码中,我有一个before块来初始化一些变量“ accPolicyData.accSizes”。

  1 var expect = require('chai').expect;
  2 var dataDriven = require('data-driven');
  3 var accPolicyData = require("./samples/accounts-policy-data");
  4 var configReadr;
  5 var ecpDB;    // = require('ecp_model');
  6 var utils = require('../test_utils');
  7 
  8 describe("Test suite for account policy limits validation", function() {
  9 
 10   before(function(done) {  
 11 
 12     // read and process commandline args.
 13     var args = utils.processArgs(process.argv);
 14     console.log("Args:", args);
 15     global.args = args;    
 16     configReader = require('../config_reader')();
 17     configReader.read().then(function() {
 18       ecpDB = require('ecp_model');   
 19 
 20       // Read the policy limits from ecp db
 21       ecpDB.AccountTemplate.findAll().then(function(results) {
 22         return results.map(function(item) { return item.toJSON(); });
 23       }).then(function(results) {     
 24         accPolicyData.accSizes = results;
 25         return done();
 26       })
 27     });
 28   }); //EOF:before
Run Code Online (Sandbox Code Playgroud)

var初始化后(第24行),我计划通过遍历结果集(第39行)在随后的describe块中使用填充的数据。

 36   describe("test cases", function() {
 37     // Iterate the account types array
 38     //dataDriven(accPolicyData.accTypes,function(type) {
 39     accPolicyData.accSizes.map(function(item) {
 40       console.log("Iterating through data...", item);
 41       testAccSizePolicy(type);
 42     });
 43     //});
 44   })
Run Code Online (Sandbox Code Playgroud)

但是,问题在于,在执行此describe块时不会填充此数组,因此不会执行循环。如果我在describe中直接有一个“ it()”块,则它可以正确执行,但是以某种方式无法进行数组迭代。

我的before()代码是异步的,并且我已经小心地正确调用了done()函数。

因此,似乎不属于它(...)的代码将尽早执行(在完成回调之前),而位于“ it”内部的代码将按顺序执行。

我的理解正确吗?

我试图通过使用嵌套循环来避免重复描述/重复块。似乎我无法做到这一点。这里有什么想法吗?

Lou*_*uis 5

摩卡设计在需要它来提前知晓所有的存在,所以所有的回调,通过测试的方式describe被执行立即,而所有的钩子(beforebeforeEach,等)并进行测试(it)注册自己的回调,将来执行。然后,当Mocha准备好实际运行测试时,它将调用这些回调。

最终,您似乎要尝试从异步算法生成测试套件。Mocha不允许您从挂钩或测试生成测试套件。您不能itbefore通话中进行呼叫,等等。如果尝试,可能会发现它似乎按预期工作的情况,但是一旦有了真正的套件(反对概念证明),您就会遇到怪异的行为。

您可以使用异步生成测试套件--delay。(您可能应该将其放入mocha.opts以便始终使用。)然后,run()在构建套件后调用。(在此页面上搜索“延迟的根套件” 。)