Angularjs 角度,基本测试不起作用

Angularjs 角度,基本测试不起作用,angularjs,jasmine,Angularjs,Jasmine,控制器: angular.module('ngApp', [ 'templates-app', 'templates-common', 'ngApp.home', 'ui.router' ]) .config(function myAppConfig($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/home'); }) .run(function run() {}

控制器:

angular.module('ngApp', [
    'templates-app',
    'templates-common',
    'ngApp.home',
    'ui.router'
])

.config(function myAppConfig($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise('/home');
})

.run(function run() {})

.controller('AppCtrl', function AppCtrl($scope) {
    $scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
        if (angular.isDefined(toState.data.pageTitle)) {
            $scope.pageTitle = toState.data.pageTitle + ' | App';
        }
    });
});
测试:

我现在没有测试任何东西,只是加载控制器。然而,这失败了

Chrome 41.0.2272 (Mac OS X 10.10.2) AppCtrl $scope.pageTitle should set pageTitle FAILED
    TypeError: undefined is not a function
        at new AppCtrl (/src/app/app.js:15:9)
        at invoke (/vendor/angular/angular.js:4203:17)
        at Object.instantiate (/vendor/angular/angular.js:4211:27)
        at /vendor/angular/angular.js:8501:28
        at /vendor/angular-mocks/angular-mocks.js:1878:12
        at Object.<anonymous> (/src/app/app.spec.js:14:19)
        at Object.invoke (/vendor/angular/angular.js:4203:17)
        at Object.workFn (/vendor/angular-mocks/angular-mocks.js:2436:20)
    Error: Declaration Location
        at window.inject.angular.mock.inject (/vendor/angular-mocks/angular-mocks.js:2407:25)
        at Suite.<anonymous> (/src/app/app.spec.js:12:30)
        at Suite.<anonymous> (/src/app/app.spec.js:11:2)
        at /src/app/app.spec.js:1:1

我认为问题在于您注入控制器的作用域和$scope。$on。试试这个:

describe('AppCtrl', function() {

beforeEach(module('ngApp'));

var $controller, $scope;

beforeEach(inject(function(_$controller_, _$rootScope_) {
    $controller = _$controller_;
    $rootScope = _$rootScope_.$new();
}));

describe('$scope.pageTitle', function() {
    it('should set pageTitle', inject(function() {            
        var AppCtrl = $controller('AppCtrl', { $scope: $scope });
        expect(true).toBe(true);
    }));
});
});

我认为问题在于您注入控制器的作用域和$scope。$on。试试这个:

describe('AppCtrl', function() {

beforeEach(module('ngApp'));

var $controller, $scope;

beforeEach(inject(function(_$controller_, _$rootScope_) {
    $controller = _$controller_;
    $rootScope = _$rootScope_.$new();
}));

describe('$scope.pageTitle', function() {
    it('should set pageTitle', inject(function() {            
        var AppCtrl = $controller('AppCtrl', { $scope: $scope });
        expect(true).toBe(true);
    }));
});
});

您需要从$rootScope创建作用域并将其注入:

    beforeEach(inject(function (_$controller_, $rootScope) {
        $controller = _$controller_;
        scope = $rootScope.$new();
        createController = function (ctrlName) {
          return $controller(ctrlName, {
            '$scope': scope
         });
       };
    }));
通过这种方式,您可以将createController函数用于以下目的:

var AppCtrl = createController('AppCtrl');
因为有了控制器

下面是一个正在工作的JSFIDLE:

编辑:$scope在哪里是空的? 如果我在此处放置一个console.log:

我可以看到:

编辑2:

将范围设置为全局变量:

describe('AppCtrl', function () {

    beforeEach(module('ngApp'));
    var $controller;
    var scope;
然后,在您的测试用例中,您可以使用它:

it('should set pageTitle', inject(function () {
    var $scope = scope;

使用新的测试用例更新了JSFIDLE:

您需要从$rootScope创建作用域并注入它:

    beforeEach(inject(function (_$controller_, $rootScope) {
        $controller = _$controller_;
        scope = $rootScope.$new();
        createController = function (ctrlName) {
          return $controller(ctrlName, {
            '$scope': scope
         });
       };
    }));
通过这种方式,您可以将createController函数用于以下目的:

var AppCtrl = createController('AppCtrl');
因为有了控制器

下面是一个正在工作的JSFIDLE:

编辑:$scope在哪里是空的? 如果我在此处放置一个console.log:

我可以看到:

编辑2:

将范围设置为全局变量:

describe('AppCtrl', function () {

    beforeEach(module('ngApp'));
    var $controller;
    var scope;
然后,在您的测试用例中,您可以使用它:

it('should set pageTitle', inject(function () {
    var $scope = scope;

用新的测试用例更新了JSFIDLE:

你能创建一个plnker吗?你能创建一个plnker吗?我得到一个未知的提供者:$\u rootScope\u provider似乎我有点搞砸了。我上次写控制器测试已经有一段时间了。下面代码的答案是正确的。解释问题:您正在创建的范围只是一个没有任何函数的空对象。如果你只是把东西放在上面就可以了,但是因为你在上面使用了$,所以你需要一个实际的范围。这就是$rootScope.new提供给您的I get Unknown provider:$\u rootScope\u provider似乎我有点搞砸了,我上次编写控制器测试已经有一段时间了。下面代码的答案是正确的。解释问题:您正在创建的范围只是一个没有任何函数的空对象。如果你只是把东西放在上面就可以了,但是因为你在上面使用了$,所以你需要一个实际的范围。这就是$rootScope.new给您的,我的意思是在测试文件中,$scope是空的,但scope不是空的。请参阅我的最新问题。我想实际测试触发事件时是否在作用域中设置了pageTitle。我的意思是在测试文件中,$scope是空的,但scope不是空的。请参阅我的最新问题。我想实际测试触发事件时是否在作用域中设置了pageTitle。