$ scope。$不在Jasmine SpecRunner中工作

时间:2016-01-07 12:15:29

标签: angularjs jasmine

我刚开始使用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);
   }));
});

这些是我的进口商品:

  • public / js / jasmine-2.4.0 / jasmine.js
  • public / js / jasmine-2.4.0 / jasmine-html.js
  • 公共/ JS /茉莉-2.4.0 / boot.js
  • public / js / jquery.min.js
  • public / js / angular.js public / js / angular-animate.min.js
  • public / js / angular-mocks.js
  • 公共/ JS / UI的自举-TPLS-0.14.2.min.js

应用程序运行正常,如果我从控制器中删除$ scope。$ on部分,测试运行。我必须在SpecRunner中做错事,或者在注入控制器时工作方式不同。任何人都可以帮我这个吗?

修改

测试最终看起来像这样:

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

1 个答案:

答案 0 :(得分:0)

您正在创建一个对象并将其作为控制器的范围注入。该对象上没有$on方法。

而是注入$rootScope并使用方法$new创建范围:

var scope = $rootScope.$new(),
    ctrl = $controller('asstCtrl', { $scope: scope });