2017-04-20 33 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

感謝您對患者詳細的說明。它非常有幫助。 –