【发布时间】:2017-02-05 22:34:02
【问题描述】:
在 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
一旦 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() 函数。
因此,看起来不属于它的代码(...)会提前执行(在完成回调之前),而“它”内部的代码会按顺序执行。
我的理解对吗?
我试图通过使用嵌套循环来避免多个 describe/it 块的代码重复。不知何故,我似乎无法做到这一点。这里有什么想法吗?
【问题讨论】:
-
before()函数调度函数在运行describe()块内的任何it()之前调用。文档中提到了。before()仅在单个describe()块内有效,因此如果您有多个describe()块,则需要调用多个before()。一般来说,一个测试文件中只有一个describe -
describe()函数在加载测试文件时立即执行,这与before*()/after*()不同(仅适用于it()函数)。 -
是您描述之前函数的那个块中的描述块吗?