【问题标题】:$scope.$on not working in Jasmine SpecRunner$scope.$on 在 Jasmine SpecRunner 中不起作用
【发布时间】:2016-04-11 19:52:22
【问题描述】:

我刚刚开始使用 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
  • public/js/jasmine-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
  • public/js/ui-bootstrap-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);
   }));
});

【问题讨论】:

    标签: angularjs jasmine


    【解决方案1】:

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

    改为注入$rootScope 并使用$new 方法创建作用域:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2014-05-14
      相关资源
      最近更新 更多