在循环中调用它语句

时间:2017-04-20 16:49:51

标签: mocha visual-studio-code

我是摩卡的新手。我在一个循环中调用it语句。我有一个工作脚本,我在这里添加,询问是否有更好的方法来做到这一点。

以下是工作脚本

var xl = require('./excel');
describe("Register User", function(){    

    var csv = xl.readExcel(); //gets multiple rows as csv.
    var arrRows = csv.split("\n");
    var arrRow = []; //will store the current row under test
    var iRow = 0;

    before(function() {
       //can variables csv and arrRows be initialized here?
    });

    beforeEach(function(){
        arrRow = xl.splitCsvToArray(arrRows[iRow++]);
    });

    for(var i = 0; i < arrRows.length - 1; i++){
        it('test case X', function(){
            console.log("current row is: " + iRow);
            console.log("1st column is: " + arrRow[0][1]);
            console.log("2nd column is: " + arrRow[0][2]);
        });        
    }
});

结果

1st column is: col2row3
2nd column is: col3row3
    √ test case X
current row is: 5
1st column is: col2row4
2nd column is: col3row4
    √ test case X
current row is: 6
1st column is: col2row5
2nd column is: col3row5
    √ test case X
current row is: 7
1st column is: col2row6
2nd column is: col3row6
    √ test case X

  7 passing (27ms)

提前致谢。

1 个答案:

答案 0 :(得分:1)

在您的代码中显示的同步循环中调用it绝对没问题。每当我需要测试一组有限的条件时,我就会这样做,并且可以通过循环生成测试。

如果您有一个异步生成测试的循环,那么您必须use --delay and call mocha.run()指示测试生成何时完成,并且Mocha可以开始运行测试。

理想情况下,您应该将csvarrRows的初始化移动到before挂钩中:

describe("Register User", function(){    

    var csv;
    var arrRows;
    var arrRow = []; //will store the current row under test
    var iRow = 0;

    before(function() {
      csv = xl.readExcel(); //gets multiple rows as csv.
      arrRows = csv.split("\n");
    });

    [...]

您应该在beforebeforeEach挂钩之外自由地进行的初始化是非常便宜的。问题是,即使套件不需要,在钩子外部执行的初始化总是完成。例如,如果您使用--grep选择之外的某些测试,则会在您的问题中显示describe,并且您的初始化设置与您在问题中显示的一样,然后是Mocha将加载您的Excel文件并将其分成行,即使它不需要。通过在包含测试的before/beforeEach块中的describe中进行此类初始化,可以确保Mocha仅在需要运行依赖于它们的测试时才运行初始化。

问题是需要定义arrRows来运行循环。你可以:

  1. 放弃在钩子之外没有初始化代码的理想。这意味着保持初始化代码不变。

  2. 将循环移到it内,并有一个检查整个数组的测试。您的测试的粒度取决于您。这是一个偏好问题,以及您测试的代码是如何构建的。这里没有严格的规则。

  3. 如果您期望的结构是常规的,并且每次都具有相同的行数。定义变量,例如TABLE_LENGTH = 10和a)将其用作循环中的限制(for(var i = 0; i < TABLE_LENGTH; i++))b)在before中包含一个断言,用于验证您获得的表格是否具有您期望的长度({{ 1}})。这样您就可以在assert.equal(arrRows.length, TABLE_LENGTH)内执行初始化,并且仍然有一个创建多个before/beforeEach的循环。