使用angular.module()。controller()进行测试

时间:2013-03-08 16:03:33

标签: angularjs jasmine

我使用module().controller()语法创建我的控制器。

angular.module('App', []);

angular.module('App').controller('PhoneListCtrl', ['$scope', function ($scope) {
    'use strict';

    $scope.phones = [
        {
            "name": "Nexus S",
            "snippet": "Fast just got faster with Nexus S."
        },
        {
            "name": "Motorola XOOM™ with Wi-Fi",
            "snippet": "The Next, Next Generation tablet."
        },
        {
            "name": "MOTOROLA XOOM™",
            "snippet": "The Next, Next Generation tablet."
        }
    ];
}]);

这很有效。但是现在我想用茉莉花来测试它,我的测试用

来回应

ReferenceError: AppController is not defined

我的测试:

/* jasmine specs for controllers go here */
describe('PhoneCat controllers', function () {

    describe('PhoneListCtrl', function () {

        it('should create "phones" model with 3 phones', function () {
            var scope = {},
                ctrl = new PhoneListCtrl(scope);

            expect(scope.phones.length).toBe(3);
        });
    });
});

如果我将控制器更改为经典功能,测试工作正常。

我缺少什么?

2 个答案:

答案 0 :(得分:1)

在测试中,您不应“手动”创建控制器实例,而是让AngularJS使用$controller服务创建实例。这是必要的,因为AngularJS DI系统需要有机会注入依赖关系。

您的测试应大致如下:

 beforeEach(module('App'));

 it('should create "phones" model with 3 phones', inject(function ($controller, $rootScope) {
    var ctrl = $controller('PhoneListCtrl', {$scope: $rootScope});   
    expect($rootScope.phones.length).toBe(3);
 }));

答案 1 :(得分:-1)

对于想要实例化新范围并使用它的人:

    var ctrl = $scope.$new();
$controller('PhoneListCtrl', {$scope: ctrl});   
    expect(ctrl.phones.length).toBe(3);