[英]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()未定义。
如果我从控制器中删除了BasketNavigationService功能,则它正在工作。
请帮助我解决该业力测试案例。
这是正在运行的演示,希望对您有所帮助。 问题是注入依赖项。
//--- 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" />
请将您的createController
设置更改为:
createController = function() {
return $controller('NavCtrl', {
'$scope': scope,
'$location':$location,
'BasketNavigationService':{showBasketList: function(){return 'test'} }
});
};
您没有注入所有依赖项。 我已经注入了虚拟的BasketNavigationService
,您可以注入真实的。
您是否尝试过运行createController();
? 我认为您的NavCtrl
控制器不会被嘲笑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.