2015-12-01 32 views
2

在使用Jasmine測試我的Meteor應用程序的某些功能之前,我必須爲測試準備不同的東西。因此我使用beforeAll塊。Jasmine - 在系列中的所有塊之前運行

  1. 重置數據庫
  2. 在數據庫中創建
  3. 講座在數據庫中創建一個問題
  4. 轉到剛創建講座的頁面
  5. 等待路由器來完成路由

這些異步任務必須串聯運行。我不能先到講座頁面,然後在數據庫中創建它。可悲的是,茉莉花beforeAll塊不會自動連續運行。

這是我當前的代碼:

beforeAll(function(done) { 
 
    Fixtures.clearDB(done); 
 
    }); 
 

 
    beforeAll(function(done) { 
 
    Fixtures.createLecture({}, function(error, result) { 
 
     lectureCode = result; 
 
     done(); 
 
    }); 
 
    }); 
 

 
    beforeAll(function(done) { 
 
    Fixtures.createQuestion({}, done); 
 
    }); 
 

 
    beforeAll(function(done) { 
 
    Router.go('lecturePage', {lectureCode: lectureCode}); 
 
    Tracker.afterFlush(done); 
 
    }); 
 

 
    beforeAll(waitForRouter); 
 
    
 
    it("....", function() { 
 
    ... 
 
    });

我怎麼可以這樣寫代碼茉莉花在一個漂亮的風格沒有進入回調地獄?

來源整個應用程序的代碼是開源的,可以在GitHub

可以找到非常感謝你提前, 最大

+0

看看異步庫([link](https://github.com/caolan/async)) – xersiee

+0

我試圖讓caolan /異步工作,但我失敗了。你能根據我的代碼給我一個例子嗎? – mxinden

回答

2

給你:

beforeAll(function(done) { 
    async.series([ 
    function(callback) { 
     Fixtures.clearDB(callback) 
    }, 
    function(callback) { 
     Fixtures.createLecture({}, function(error, result) { 
      lectureCode = result; 
      callback(); 
     }); 
    }, 
    function(callback) { 
     Fixtures.createQuestion({}, callback); 
    }, 
    function(callback) { 
     Router.go('lecturePage', {lectureCode: lectureCode}); 
     Tracker.afterFlush(callback); 
    }],function(err, results){ // callback called when all tasks are done 
     done(); 
    }); 
} 

我沒有測試過,但我希望你拿個主意。您需要創建函數列表,每個函數都會提供回調函數,您需要調用該函數才能使下一個函數運行。在最後的回調被調用之後,我們可以調用done()來告訴茉莉花我們完成了。希望這可以幫助。

+0

非常感謝。爲我工作。 – mxinden

1

我一般的做法是有一個單一的beforeAll塊。

在該塊內部,使用承諾API將所有這些調用鏈接爲承諾。

beforeAll(function(done) { 
 
    Fixtures.clearDB(done).then(... 
 
    }); 
 

 
    beforeAll(waitForRouter); 
 
    
 
    it("....", function() { 
 
    ... 
 
    });

相關問題