2013-08-27 2 views
24

Я использую жасмин для тестирования angularJS. В моих взглядах, я использую «контроллер как» синтаксис:Как использовать переменные scope с синтаксисом «Контроллер как» в Jasmine?

<div ng-controller="configCtrl as config"> 
    <div> {{ config.status }} </div> 
</div> 

Как я могу использовать эти «рамку» переменные в жасмине? Что означает «Контроллер как»? Мой тест выглядит следующим образом:

describe('ConfigCtrl', function(){ 
    var scope; 

    beforeEach(angular.mock.module('busybee')); 
    beforeEach(angular.mock.inject(function($rootScope){ 
     scope = $rootScope.$new(); 

     $controller('configCtrl', {$scope: scope}); 
    })); 

    it('should have text = "any"', function(){ 
     expect(scope.status).toBe("any"); 
    }); 
}); 

Вызов scope.status концов, наверняка, с ошибкой:

Expected undefined to be "any". 

UPDATE: Контроллер (составитель Javascript из машинопись) выглядит следующим образом:

var ConfigCtrl = (function() { 
    function ConfigCtrl($scope) { 
     this.status = "any"; 
    } 
    ConfigCtrl.$inject = ['$scope']; 
    return ConfigCtrl; 
})(); 
+0

По крайней мере, вы должны сделать 'ожидать (scope.config.status) .toBe ("любой");' – zsong

+0

Укажите код для 'configCtrl' как синтаксис почти как делают' $ объем. config = this; 'и делать' this.status = "any"; '. –

+0

Он работает, если я определяю '$ scope.config = this;' вручную в моем контроллере. Но я думаю, что это не так, как должно быть, не так ли? – 3x14159265

ответ

46

Решение заключается в использовании синтаксиса «контроллер как» при создании экземпляра вашего контроллера в ваших tes т. В частности:

$ controller ('configCtrl as config', {$ scope: scope});

Ожидайте (scope.config.status) .toBe ("any"); Теперь

Следующие должны пройти:

describe('ConfigCtrl', function(){ 
    var scope; 

    beforeEach(angular.mock.module('busybee')); 
    beforeEach(angular.mock.inject(function($controller,$rootScope){ 
     scope = $rootScope.$new(); 

     $controller('configCtrl as config', {$scope: scope}); 
    })); 

    it('should have text = "any"', function(){ 
     expect(scope.config.status).toBe("any"); 
    }); 
}); 
+0

К сожалению, это не работает для меня. Я получаю сообщение об ошибке «Ошибка: Аргумент« configCtrl as config »не является функцией, не определена в path/to/angular.js (строка 1039)' в строке '$ controller ('configCtrl as config', {$ scope: scope}); ' – 3x14159265

+0

Должен работать, см. собственный тестовый код AngularJS для функции« controller as »здесь https://github.com/angular/angular.js/blob/v1.2.0-rc.3/test/ng/ controllerSpec.js # L112 – Beyers

+0

@ 3x14159265 Две другие вещи, чтобы проверить/попробовать: (1) ввести $ controller, например 'beforeEach (inject (function ($ controller, $ rootScope) {'. и (2) убедитесь, что ваш модуль, где определен configCtrl, загружен. Я использую этот синтаксис в AngularJS 1.2.0 RC3 без каких-либо ошибок. – Beyers

15

Когда мы используем синтаксис controller as, не должно быть никакой необходимости вводить $ rootScope в нашем тесте. Следующее должно работать нормально.

describe('ConfigCtrl', function(){ 
    beforeEach(module('busybee')); 

    var ctrl; 

    beforeEach(inject(function($controller){ 
     ctrl = $controller('ConfigCtrl'); 
    })); 

    it('should have text = "any"', function(){ 
     expect(ctrl.status).toBe("any"); 
    }); 
}); 
+7

Иногда вам по-прежнему нужен доступ к $ scope внутри вашего контроллера, даже если вы используете 'controller as' – Beyers

Смежные вопросы