摩卡 - 之前()之前没有执行过'正如所料?

时间:2016-09-28 06:03:02

标签: node.js mocha chai

在mocha + chai测试代码中,我有一个初始化某个变量的前块" 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()代码是异步的,我已经注意正确调用done()函数。

因此,看起来不属于它的代码(...)将在早期(在完成回调之前)执行,并且该代码在内部"它"以顺序方式执行。

我的理解是对的吗?

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

1 个答案:

答案 0 :(得分:5)

Mocha的设计方式要求它提前知道所有存在的测试,以便传递给describe的所有回调都立即执行 ,而所有的钩子都是{{{ 1}},before等)和测试(beforeEach)注册他们的回调以供将来执行。然后,当Mocha准备好实际运行测试时,它会调用这些回调。

最终,您尝试做的就是从异步算法生成测试套件。 Mocha不允许您从钩子或测试中生成测试套件。您无法在it来电等中拨打it。如果您尝试,您可能会发现它似乎按预期工作的情况,但只要您有真实的套件(通过反对概念证明),你会遇到奇怪的行为。

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