繁体   English   中英

从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()未定义。

如果我从控制器中删除了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" /> 

小提琴: http : //jsfiddle.net/invincibleJai/pf1deoom/1/

请将您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM