摩卡 – 之前()不执行“之前”按预期?

在mocha + chaitesting代码中,我有一个before块来初始化一些variables“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 

一旦var被初始化(第24行),我打算通过遍历结果集(第39行)在随后的描述块中使用填充的数据。

  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 }) 

然而,问题是这个数组没有被这个描述块的执行时间填充,因此这个循环没有被执行。 它正确执行,如果我直接在描述中有一个“it()”块,但以某种方式失败的数组迭代。

我的before()代码是asynchronous的,我已经注意正确地调用done()函数。

所以,看起来不是它的一部分的代码(…)会在执行完callback之前得到执行,而在“it”内部的代码将按顺序执行。

我的理解是正确的吗?

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

摩卡的devise方式要求它提前知道所有存在的testing,以便所有传递给describecallback立即执行,而所有钩子( beforebeforeEach等)和testing( it )注册它们的callback为将来的执行。 然后,当Mocha准备实际运行testing时,它会调用这些callback函数。

最终,它看起来像你试图做的是从asynchronousalgorithm生成你的testing套件。 摩卡不允许你从钩子或testing中生成你的testing套件。 你不能before打电话before打电话等等。如果你尝试了,你可能会发现它看起来像预期的那样工作,但只要你有一个真正的套房(通过反对概念certificate),你会遇到奇怪的行为。

您可以使用--delayasynchronous生成testing套件。 (你可能应该把它放在mocha.opts这样它才能被使用。)然后,一旦你的套件被创build,就调用run() 。 (在此页面上search“延迟的根套件”。)