我的控制器效果很好。但是当我想在karma中测试它时,$ scope.on方法会出现未定义。
这是我的控制器:
angular.module('myApp').controller('DataController', [
'$scope', 'DataProvider' function($scope, DataProvider) {
$scope.customData = [];
$scope.$on('$stateChangeSuccess', function() {
DataProvider.getData().then(function(response) {
$scope.customData = response.data.customData;
});
});
}
]);
这是我的测试:
'use strict';
describe('DataController', function(){
beforeEach(function() {
module('myApp', [])
});
it('exists', inject(function($controller) {
var myCtrl = $controller('DataController', { $scope: {} });
expect(myCtrl).toBeDefined();
}));
});
答案 0 :(得分:3)
你的$scope
不是真正的角scope
对象,它只是一个空对象。在这种情况下,您需要创建$rootScope
的新子范围,以便在注入的$on
中使用$scope
方法。
尝试: -
it('exists', inject(function($controller, $rootScope) {
var myCtrl = $controller('DataController', { $scope: $rootScope.$new() });
expect(myCtrl).toBeDefined();
}));
答案 1 :(得分:1)
我写的测试不正确。
我需要实例化一个范围并将其注入。另一个关键点是使范围和myCtrl变量可用于所有测试。
describe('DataController', function(){
var scope, myCtrl;
beforeEach(function(){
module('myApp');
})
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
myCtrl = $controller('DataController', { $scope: scope });
scope.$digest();
}));
it('exists', function() {
expect(myCtrl).toBeDefined();
});
});
现在我只需要弄清楚如何在单元测试中触发$ stateChangeSuccess事件。