2013-03-08 6 views
1

Я создаю свои контроллеры с синтаксисом module().controller().Использование angular.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); 
     }); 
    }); 
}); 

Если изменить контроллер к классической функции, тест работает нормально.

Что мне не хватает?

ответ

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); 
})); 
+0

После нескольких тестов, я обнаружил, что из, что я должен загрузить модуль перед разрешением контроллера. beforeEach (модуль ('App')); – S3PP3L

+0

Почему все примеры и ваш код используют 'var ctrl = ...'? Эта переменная никогда не используется, и если я ее правильно понимаю, она всегда '{}'. – nh2

+0

, откуда берутся функции ввода и модуля? когда i console.log (typeof module), я получаю undefined, когда я запускаю свой тест. – skaterdav85

0

Для людей, которые хотят т инстанцирует новую область и использовать его:

var ctrl = $scope.$new(); 
$controller('PhoneListCtrl', {$scope: ctrl}); 
    expect(ctrl.phones.length).toBe(3); 
Смежные вопросы