2017-04-19 56 views
0

我正在使用Jasmine/Karma來測試Angularjs代碼,而我是Jasmine的全新產品。我有一個基本的測試,使用expect(true).toEqual(true)這是有效的,所以它看起來像設置是好的。有一次,我嘗試測試實際使用控制器的東西,我得到如下:

類型錯誤:「 $範圍$上(」未定義是不是一個函數(評估myEvent」,函數(事件數據)

我有幾個$ $範圍的方法,並不要緊什麼樣的順序,他們都在,它抱怨的第一個這裏的控制器是如何設置的摘錄:。

angular.module('myProject.dataType') 
.controller('DataTypeController', ['$scope', '$state', '$rootScope', function($scope, $state, $rootScope) { 
    $scope.dataTypeId=""; 
...other stuff... 
    $scope.$on('myEvent', function(event, data) { 
     $scope.dataTypeId = ""; 
    }); 
}]); 

這裏是我的規格文件:

describe("Data Type Controller', function() { 
    beforeEach(module('myProject.dataType')); 
    var $controller; 

    beforeEach(inject(function(_$controller_) { 
     $controller = _$controller_; 
    })); 

    describe('Create type', function() { 
     it('basic test', function() { 
     var $scope = {}; 
     var controller = $controller('DataTypeController', {'$scope': $scope}); 
     expect(true).toEqual(true); 
     }); 
    }); 
}); 

請注意,實際的代碼(而不是茉莉花)工作得很好。如果我註釋掉「var controller ...」這一行,測試通過。在這一點上,我其實並沒有嘗試調用任何東西,所以我不確定它爲什麼會觸及$scope.$on,更不用說失敗了。我最好的猜測是,我在spec文件中設置了示波器的方式有些問題。

我已經檢查過文件版本(根據對類似問題的回答),並盡我所能確保沒有錯別字或胖手指參與。任何幫助是極大的讚賞。

回答

2

我相信你需要將範圍注入到beforeEach fn中,而不是將其定義爲空對象。現在你的$ scope實際上是一個空對象,所以方法'$ on'不存在於測試的上下文中。

用途:

beforeEach(inject(function(_$controller_, _$rootScope_) { 
     $controller = _$controller_; 
     $scope = _$rootScope_.$new(); 
    })); 
+0

我曾試圖在這之前,但我想我有$ rootScope代替_爲$ rootScope_。這工作。多謝! –

相關問題