2012-08-02 53 views
0

我有我的測試計時問題。我正在使用事件聚合器來引發事件,問題是我的規範在代碼到達引發的事件之前完成。我需要在運行完畢的代碼之後運行規範。骨幹Marioniette事件.EventAggregator和測試

例如,我創建一個佈局,然後引發一個事件:

DocumentManager.addInitializer(function(){ 
    DocumentManager.layout = new Layout(); 

    DocumentManager.layout.on("show", function(){ 
     DocumentManager.vent.trigger("layout:rendered"); 
    }); 

    DocumentManager.content.show(DocumentManager.layout) 
    }); 

我然後創建佈局創建後,另一種觀點認爲:

DocumentManager.vent.on("layout:rendered", function(){ 
    Documents.folders = new Documents.Folders(); 

    Documents.folders.reset(window._rootFolder);  

    Documents.treeRoot = new Documents.TreeRoot({ 
     collection: Documents.folders 
    }); 

    DocumentManager.layout.treeView.show(Documents.treeRoot); 

    DocumentManager.vent.trigger("folder:added"); 
    }); 

的問題是,我的規格在此代碼運行之前完成:

describe 'battlebox', -> 
    describe 'versioned documents', -> 
    describe 'empty root and no files', -> 
     beforeEach -> 
     loadFixtures "battlebox.html" 
     DocumentManager.start() 
     window._rootFolder = Test.Factory.BattleBox.emptyRoot() 

     it "should create a root folder", -> 
     expect(DocumentManager.Documents.folders.length).toEqual 1 

我的選擇是觸發事件從測試或將「layout:rendered」事件處理程序中的代碼重構爲我「測試」設置並調用的方法。

我很好奇,如果有人有更好的主意?

回答

1

如果itbeforeEach完成之前運行,那麼在您的設置中有一些代碼異步運行。你將不得不使用Jasmine的異步功能來完成這項工作。 https://github.com/pivotal/jasmine/wiki/Asynchronous-specs

另外 - 你可能想把你的測試分成小塊。由於您有觸發的事件以便於文件夾的渲染,因此請在此處分割測試。有一個測試顯示初始化程序正確設置佈局。然後進行另一個測試,顯示文件夾正在呈現正確。您可以通過在測試中直接觸發「layout:rendered」事件來進行第二次測試。

2

我使用兩種類型的異步檢查:

與規範的一個例子:

describe 'battlebox', -> 
    describe 'versioned documents', -> 
    describe 'empty root and no files', -> 
     beforeEach -> 
     loadFixtures "battlebox.html" 

     it "should create a root folder", -> 
     # Expect event 'layout:rendered' to be triggered 
     TestHelpers.eventTriggeredOn DocumentManager.vent, 'layout:rendered', => 
      expect(DocumentManager.Documents.folders.length).toEqual 1 

     # Async bit 
     DocumentManager.start() 
     window._rootFolder = Test.Factory.BattleBox.emptyRoot()