$ scope。$在单元测试期间在控制器中未定义

时间:2014-08-13 22:52:30

标签: javascript angularjs unit-testing

我的控制器效果很好。但是当我想在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();
  }));

});

2 个答案:

答案 0 :(得分:3)

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

尝试: -

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

答案 1 :(得分:1)

我写的测试不正确。

我需要实例化一个范围并将其注入。另一个关键点是使范围和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();
  });

 });

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