2016-01-07 3 views
0

Я только что начал использовать Jasmine для тестирования приложения AngularJS. Я считаю, что я делаю все импорта на SpecRunner, но я получаю сообщение об ошибке:

TypeError: $scope.$on is not a function 

Я использую это в моем контроллере следующим образом:

app.controller('asstCtrl', function($scope, $uibModal, $interval, $document) { 
    $scope.$on('$includeContentLoaded', function() {   
     $scope.doStuff();   
    }); 
}); 

... 

Мой SpecRunner тест выглядит как это:

describe('calculator', function(){ 
    beforeEach(module('asst')); 
    it('basic', inject(function($controller) { 
     var scope = {}, 
      ctrl = $controller('asstCtrl', {$scope:scope}); 
    expect(scope.x).toBe(1); 
    })); 
}); 

это мой импорт:

  • общественные/JS/жасмин-2.4.0/jasmine.js
  • общественные/JS/жасмин-2.4.0/жасмин-html.js
  • общественные/JS/жасмин-2.4.0/boot.js
  • общественный/JS/jquery.min.js
  • общественных/JS/angular.js общественных/JS/угловой animate.min.js
  • общественных/JS/угловой mocks.js
  • общественного/JS /ui-bootstrap-tpls-0.14.2.min.js

Приложение работает нормально и тест выполняется, если я удаляю $ scope. $ на разделе с моего контроллера. Я должен делать что-то неправильно в SpecRunner или что-то работает по-разному, когда я вводил контроллер. Кто-нибудь может мне с этим помочь?

EDIT

Тест закончился выглядеть так:

describe('calculator', function(){ 
    beforeEach(module('asst')); 
    var rootScope; 
    beforeEach(inject(function($rootScope) { 
    rootScope = $rootScope; 
    })); 
    it('basic', inject(function($controller) { 
     var scope = rootScope.$new(), 
      ctrl = $controller('asstCtrl', {$scope:scope}); 
    expect(scope.x).toBe(1); 
    })); 
}); 

ответ

0

Вы создаете объект и инъекционные, что в рамках controller's. На этом объекте не будет метода $on.

Вместо впрыскивать $rootScope и использовать метод $new создать область:

var scope = $rootScope.$new(), 
    ctrl = $controller('asstCtrl', { $scope: scope }); 
Смежные вопросы