【问题标题】:Unit Testing a Controller in Angular.js在 Angular.js 中对控制器进行单元测试
【发布时间】:2015-04-03 02:44:58
【问题描述】:

我正在关注如何对控制器进行单元测试的 Angular 教程。我正在使用 Karma 和 Jasmine 进行测试。当我运行测试时,我得到了

Error: [ng:areq] Argument 'testController' is not a function, got undefined

关于如何在 test.js 中加载 testController 有什么想法吗?代码如下。谢谢!

<!-- app.js --> 

var simulatorApp = angular.module('simulatorApp', ['ngRoute', 'ngResource', 'ngCookies'],

simulatorApp.config(['$routeProvider', function($routeProvider) {
    $routeProvider
        .when('/', {templateUrl: '/angular/views/home.html', controller: homeController})
        .when('/test', {templateUrl: '/angular/views/test.html', controller: testController})
        .otherwise({redirectTo: '/'});
}]);

<!-- testController.js -->

function testController($scope) {
    $scope.password = '';
    $scope.grade = function () {
        var size = $scope.password.length;
        if (size > 8) {
            $scope.strength = 'strong';
        } else if (size > 3) {
            $scope.strength = 'medium';
        } else {
            $scope.strength = 'weak';
        }
    };
}

<!-- test.js -->
describe('testController', function() {
    beforeEach(module('simulatorApp'));

    var $controller;

    beforeEach(inject(function (_$controller_) {
        // The injector unwraps the underscores (_) from around the parameter names when matching
        $controller = _$controller_;
    }));

    describe('$scope.grade', function () {
        it('sets the strength to "strong" if the password length is >8 chars', function () {
            var $scope = {};
            var controller = $controller('testController', {$scope: $scope});
            $scope.password = 'longerthaneightchars';
            $scope.grade();
            expect($scope.strength).toEqual('strong');
        });
    });
})

【问题讨论】:

    标签: javascript angularjs unit-testing karma-jasmine


    【解决方案1】:

    你没有在模块中定义你的控制器

    simulatorApp.controller('testController', function testController($scope) {
        $scope.password = '';
        $scope.grade = function () {
            var size = $scope.password.length;
            if (size > 8) {
                $scope.strength = 'strong';
            } else if (size > 3) {
                $scope.strength = 'medium';
            } else {
                $scope.strength = 'weak';
            }
        };
    })
    

    【讨论】:

    • 想通了,我需要在 $routeProvider 中将我的控制器作为字符串引用。谢谢!
    【解决方案2】:

    这是一个有效的plunkr

    正如Narek Mamikonyan 回答的那样,您还没有在您的模块上注册您的控制器。

    simulatorApp.controller('testController', testController);
    
    function testController($scope) {
        ...
    };
    

    homeController 可能存在同样的问题

    simulatorApp.controller('homeController', homeController);
    
    function homeController($scope) {
        ...
    };
    

    此外,您应该尝试将您的控制器声明为这样,因为如果您对 javascript 文件进行了缩小,这不会爆炸

    simulatorApp.controller('testController', ['$scope', testController]);
    

    如果您不这样做,$scope 在缩小后将不一样,您的应用将无法运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-11
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2012-04-24
      • 2017-04-26
      • 2018-09-19
      相关资源
      最近更新 更多