Javascript 单元测试期间控制器中未定义的$scope.$

Javascript 单元测试期间控制器中未定义的$scope.$,javascript,angularjs,unit-testing,Javascript,Angularjs,Unit Testing,我的控制器工作得很好。但是当我想在karma中测试它时,$scope.on方法被认为是未定义的 这是我的控制器: angular.module('myApp').controller('DataController', [ '$scope', 'DataProvider' function($scope, DataProvider) { $scope.customData = []; $scope.$on('$stateChangeSuccess', function() {

我的控制器工作得很好。但是当我想在karma中测试它时,$scope.on方法被认为是未定义的

这是我的控制器:

angular.module('myApp').controller('DataController', [
  '$scope', 'DataProvider' function($scope, DataProvider) {
    $scope.customData = [];
    $scope.$on('$stateChangeSuccess', function() {
      DataProvider.getData().then(function(response) {
        $scope.customData = response.data.customData;
        });
      });
  }
]);
这是我的测试:

'use strict';

describe('DataController', function(){

  beforeEach(function() {
    module('myApp', [])
  });

  it('exists', inject(function($controller) {
    var myCtrl = $controller('DataController', { $scope: {} });
    expect(myCtrl).toBeDefined();
  }));

});

您的
$scope
并不是真正的角度
scope
对象,它只是一个空对象。在这种情况下,您需要创建
$rootScope
的新子作用域,以便在注入的
$scope
中使用
$on
方法

尝试:-


我的试卷写错了

我需要实例化一个作用域并将其注入。另外一个关键点是使scope和myCtrl变量可用于所有测试

describe('DataController', function(){
 var scope, myCtrl;
  beforeEach(function(){
    module('myApp');
  })

  beforeEach(inject(function($rootScope, $controller) {
    scope = $rootScope.$new();
    myCtrl = $controller('DataController', { $scope: scope });
    scope.$digest();

  }));
  it('exists', function() {
    expect(myCtrl).toBeDefined();
  });

 });

现在我只需要弄清楚如何在单元测试中触发$stateChangeSuccessuccess事件。

您想执行
$scope:$rootScope.$new()
而不是
$scope:{}
describe('DataController', function(){
 var scope, myCtrl;
  beforeEach(function(){
    module('myApp');
  })

  beforeEach(inject(function($rootScope, $controller) {
    scope = $rootScope.$new();
    myCtrl = $controller('DataController', { $scope: scope });
    scope.$digest();

  }));
  it('exists', function() {
    expect(myCtrl).toBeDefined();
  });

 });