2017-04-20 75 views
0

我是摩卡新手。我在循环中调用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

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

如果你有一个循环,异步生成测试那么你必须use --delay and call mocha.run()来指示测试生成完成和摩卡可以开始运行测试。

理想情况下,你应该将你的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文件并将其分解成行,即使它不需要。通过在包含测试的describe块中放入before/beforeEach这样的初始化,您可以确保Mocha仅在需要运行依赖于测试的测试时才会运行初始化。

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

  1. 放弃不具有钩以外的初始化代码的理想。这意味着保持你的初始化代码。

  2. 移动it内部的循环,并有一个检查整个阵列的测试。您的测试粒度取决于您。这是一个偏好问题,以及您测试的代码是如何构建的。这里没有硬性规定。

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

+0

Thanks @Louis。我已经按照建议通过添加初始化来尝试,就像您在'之前'显示的那样。然而,在这行''for(var i = 0; i

+0

我已经编辑了您的问题中的代码,以反映您在此评论中所说的内容,并且编辑了我的答案以处理问题。 – Louis

+0

感谢您对患者详细的说明。它非常有帮助。 –