2014-09-30 27 views
0

我正在創建一個單元測試框架,並且試圖弄清楚如何在不使用全局變量的情況下輸出以下代碼段:創建類似於Mocha的單元測試框架JavaScript

describe("Test Title", function() { 
    it("should return a string", function() { 
     /* Assertions here */ 
    }); 
}); 
//OUTPUT: "PASS: Test Title should return a string" 

有人可以解釋如何it方法調用設法得到其參數之一達到describe

如果這還不清楚,我想說的是我想知道一個變量如何通過回調移動。如果我明白髮生了什麼,在回調中調用外部函數的方法會以某種方式獲得另一個外部函數的參數。

+0

你可以看看摩卡如何在這裏定義BDD接口:https://github.com/visionmedia/mocha/blob/master/lib/interfaces/bdd.js – naomik 2014-09-30 01:18:16

+0

我不確定你爲什麼試圖在這裏重新發明輪子。除非你做了非常不同的事情。 – naomik 2014-09-30 01:19:29

+0

感謝鏈接@naomik。這是一個學校項目,這就是爲什麼我想弄明白。是否可以使用'.call'方法調用回調函數?你可以傳入一個變量來使用另一種方法嗎? – HarrisonG16 2014-09-30 01:46:46

回答

1

您可能認爲it會執行傳遞給它的回調函數。它沒有。它只是將回調註冊爲測試。

最簡單的實現是描述運行測試:

var tests = []; 

function describe(description,fn) { 
    fn(); 
    for (var i=0;i<tests.length;i++) { 
     try { 
      tests[i].fn(); 
      console.log('FAIL:' + description + ' ' + tests[i].description); 
     } 
     catch (e) { 
      console.log('FAIL:' + description + ' ' + tests[i].description); 
     } 
    } 
} 

function it(description,fn) { 
    tests.push({ 
     description: description, 
     fn: fn 
    }); 
} 

然而,從似乎連describe並沒有真正運行代碼摩卡代碼一眼,只登記了測試套件的另一個功能處理:

function describe(description,fn) { 
    fn(); 
    testSuites.push({ 
     description: description, 
     tests: tests.slice(0) 
    }); 
} 

但是邏輯是一樣的。用所有的值創建一個數據結構,然後處理它們。