2014-03-28 42 views
1

我找不到任何其他的問題/答案,以滿足我的需求,所以這裏是:

在AngularJS(1.2.14)控制器,我有一個事件偵聽器,執行ajax調用來獲取一些數據時聽到一個事件('fetchData')。提取成功後,將廣播一個事件(稱爲'fetchSuccess'),指令正在監聽(儘管該部分不相關)。

$scope.$on('fetchData', function() { 
      $scope 
       .submitSearch() 
       .then(function (results) { 
        $scope.$broadcast('fetchSuccess'); 
       }, function() { 
        $scope.$broadcast('fetchError'); 
       }); 
     }); 

所以,在我的測試中,我想這樣做(假設「this.scope」是在測試套件控制器上一個新的$ scope對象):

it('should broadcast "fetchSuccess"', inject(function ($rootScope) { 
     var scope = this.scope, 
      spy = chai.spy(scope, '$broadcast'); 

     // trigger the $broadcast event that calls the fetch method 
     scope.$broadcast('fetchData'); 

     $rootScope.$apply(); 

     expect(scope.$broadcast).to.be.called.with('fetchSuccess'); 
    })); 

但我不清楚如何在斷言中監聽$ broadcast事件。我不斷收到此錯誤:Asse田:預期函數(名稱args){...}

只是要清楚,我的問題是不是與事件廣播或運行期間聽衆的功能;該應用程序按預期工作。問題在於聆聽測試套件中的事件。

請注意,上述代碼只是此問題所需的必要代碼片段。在我的應用程序中,還有其他變量/方法被設置/調用,並且這些事情正確地測試出來。這意味着如果我測試是否調用實際的讀取方法,或者如果正確設置了特定的變量,那麼這些測試會通過。

我試過混合並匹配範圍變量,甚至通過scope.$on('fetchSuccess', fn)監聽$廣播,但似乎沒有任何工作。 fetchSuccess事件似乎沒有發射,或者我沒有正確地聽它。

在此先感謝, 瑞恩。

回答

1

所以,我找到了我的問題的答案,這都是我的錯。雖然我必須修改測試的寫法,但核心問題就像聽錯事件一樣簡單!

但是,對於那些想知道我的測試樣子,這裏是最後的測試(rootscope被設置爲$ rootScope其​​他地方):

it('should broadcast a "fetchSuccess" event', function (done) { 
    var eventEmitted = false; 
    this.scope.$on('fetchSuccess', function() { 
      eventEmitted = true; 
      done(); 
     }); 

     this.scope.$broadcast('fetchData'); 

    rootscope.$apply(); 

    eventEmitted.should.be.true; 
}); 

沒有必要窺視$廣播事件中,AngularJS $on聽衆已足夠。

相關問題