从 Karma 和 Jasmine 测试调用控制器函数
Call a controller function from Karma and Jasmine testing
这是我的角度控制器:-
angular.module('authoring-controllers', []).
controller('NavCtrl', function($scope, $location, BasketNavigationService) {
$scope.test= function() {
$scope.testVar = BasketNavigationService.showBasketList();
};
});
测试类
describe('NavCtrl', function() {
var scope, $location, createController;
beforeEach(inject(function ($rootScope, $controller, _$location_) {
$location = _$location_;
scope = $rootScope.$new();
createController = function() {
return $controller('NavCtrl', {
'$scope': scope
});
};
}));
it('should create $scope.testVar when calling test',
function() {
expect(scope.testVar).toBeUndefined();
scope.test();
expect(scope.testVar).toBeDefined();
});
});
当我运行该测试用例时出现错误:- scope.test() 未定义。
如果我从控制器中删除了篮子导航服务功能,那么它就可以工作了。
请帮助我解决该业力测试用例。
这是工作演示,希望对您有所帮助。问题在于注入依赖项。
//--- CODE --------------------------
(function(angular) {
// Create module
var myApp = angular.module('myApp', []);
// Controller which counts changes to its "name" member
myApp.controller('MyCtrl', ['$scope', 'BasketNavigationService',
function($scope, BasketNavigationService) {
$scope.test = function() {
$scope.testVar = BasketNavigationService.showBasketList();;
};
}
]);
})(angular);
// ---SPECS-------------------------
describe('myApp', function() {
var scope,
controller;
beforeEach(function() {
module('myApp');
});
describe('MyCtrl', function() {
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
controller = $controller('MyCtrl', {
'$scope': scope,
'BasketNavigationService': {
showBasketList: function() {
return null;
}
}
});
}));
it('should create $scope.testVar when calling test',
function() {
expect(scope.testVar).toBeUndefined();
scope.test();
// scope.$digest();
expect(scope.testVar).toBeDefined();
});
});
});
// --- Runner -------------------------
(function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function(spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
<script src="http://jasmine.github.io/1.3/lib/jasmine.js"></script>
<script src="http://jasmine.github.io/1.3/lib/jasmine-html.js"></script>
<script src="https://code.angularjs.org/1.2.9/angular.js"></script>
<script src="https://code.angularjs.org/1.2.9/angular-mocks.js"></script>
<link href="http://jasmine.github.io/1.3/lib/jasmine.css" rel="stylesheet" />
小提琴:http://jsfiddle.net/invincibleJai/pf1deoom/1/
请将createController
设置更改为:
createController = function() {
return $controller('NavCtrl', {
'$scope': scope,
'$location':$location,
'BasketNavigationService':{showBasketList: function(){return 'test'} }
});
};
您没有注入所有依赖项。我注射了假BasketNavigationService
,你可以注射真。
你试过运行createController();
吗?我不认为你的NavCtrl
控制器被嘲笑。
相关文章:
- 如何在单击复选框后调用控制器方法
- 未调用控制器
- 在Angular中呈现DOM对象时,如何调用控制器中指定的函数
- 调用控制器后Ajax抛出错误
- 如何在使用$timeout进行指令渲染后调用控制器方法
- AngularJs 从指令中的另一个调用控制器
- 有没有办法从 javascript 函数调用控制器操作
- Angularjs:路由后如何调用控制器函数
- MVC 下拉列表更改事件未正确调用控制器中的操作
- Angularjs指令调用控制器函数
- ng重复调用控制器功能的次数太多
- 如何在angular js中从指令调用控制器函数
- 使用ng-include调用控制器时AngularJS路由解析
- Angularjs将函数从控制器传递到指令(或从指令调用控制器函数)-带参数
- 通过javascript调用控制器方法
- 一键点击首先调用javascript,执行验证,然后调用控制器方法
- 如何使用ajax从javascript调用控制器函数
- 角度ng重复支持从0到n重复,而不调用控制器
- 在视图中未使用Javascript调用控制器操作
- 从AngularJS中的视图调用控制器函数