2013-05-21 44 views
13

我在我的Angular應用程序中有一個事件監聽器的控制器,定義如下。

angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) { 

    [...] 

    $scope.$on("myEvent", function(args, value) { 
     testService.doStuff(value); 
    }); 
    }); 

這完美地在應用程序本身。然而,當我嘗試單元測試控制器(使用茉莉)的功能,每個測試方法引發以下錯誤:

TypeError: $scope.$on is not a function in [...]/testController.js 

創建所述控制器在我的測試方法如下所述。

it('does stuff', inject(function($rootScope, $controller, testService) { 
    var scope = $rootScope.$new; 
    $controller('TestCtrl', { 
     $scope : scope 
    }); 

    [...] 
    })); 

我能找到解決這個問題,通過改變我的控制器使用rootScope代替:

$rootScope.$on(...) 

但隨後的過程應用程序已經不正常工作。我也可以擺脫錯誤的在我的測試代碼引入$on方法:

var scope = $rootScope.$new; 
    scope.$on = function() {}; 

但嘲諷聽衆喜歡這種失敗的測試我真正的代碼的目的。

爲什麼不測試代碼中找到的scope$on方法?(但在rootScope上找到它,仍然...)

必須有一些基本的東西,我在這裏失蹤了,但是我還是無法弄清楚,即使經過大量的谷歌搜索和閱讀Angular源代碼。

回答

16

$rootScope.$new是一個函數。你需要調用它($rootScope.$new()):

it('does stuff', inject(function($rootScope, $controller, testService) { 
    var scope = $rootScope.$new(); 
    $controller('TestCtrl', { 
    $scope : scope 
    }); 

    [...] 
})); 

例普拉克:http://plnkr.co/edit/t1x62msmOQDkNItGzcp9?p=preview

+0

謝謝!這真是一個令人尷尬的錯誤......(唉!)我不知道爲什麼我會這樣寫,但是這個錯誤已經感染了我所有的測試類。 – MJV