单元测试 $scope.$on AngularJS

Unit Testing $scope.$on AngularJS

大家好,我正在努力测试 $.on 函数,我正在寻找有关此的任何建议或帮助:

控制器

  $scope.$on("sampleFilesSelected", function(event, args) {
                $scope.sampleFiles = args.newSampleFiles;
            }); 

规格

describe('Testing a $.on', function() {
  var $scope = null;
  var ctrl = null;


  beforeEach(module('test'));

  it('should invoke myEvent when "myEvent" broadcasted', inject(function($rootScope, $controller) {
    $scope = $rootScope.$new();

    ctrl = $controller('MainCtrl', {
      $scope: $scope
    });

    $scope.$broadcast('myEvent');
    expect($scope.sampleFilesSelected).toBe(true);
  }));
});

错误

TypeError: Unable to get property 'newSampleFiles' of undefined or null reference
        undefined

您应该将一个值传递给您的事件,在断言之前调用 $digest :

$scope.$broadcast('myEvent', { 'newSampleFiles' : true } );
$scope.$digest();
expect($scope.sampleFilesSelected).toBe(true);

此代码...

$scope.$broadcast('myEvent');

没有传递任何参数,因此 args.newSampleFiles 抛出错误,因为参数未定义

你需要传递参数——我不知道你是怎么做到的

但是,我想说...单元测试用于测试控制器代码,而不是真正用于测试事件处理。你的例子有点极端。我很想使用 E2E 测试和量角器来测试事件处理。

我会重构如下...

$scope.$on("sampleFilesSelected", function(event, args) {
                $scope.sampleFiles = args.newSampleFiles;
            });

会变成...

$scope.myFunction = function(event, args) {
   $scope.sampleFiles = args.newSampleFiles;
}

$scope.$on("sampleFilesSelected", $scope.myFunction);

我会单元测试 $scope.myFunction。并将 $scope.$on 的测试留给 E2E 量角器测试。

希望对您有所帮助

你犯了三个错误,第一个是你在控制器中 listening/subscribing 到一个名为 sampleFilesSelected 的事件,但在你的测试中,你正在向任何正在收听的人广播参加名为 myEvent 的活动?

其次,一旦上述问题得到解决,您应该在触发事件后 运行 $scope.$digest() 循环,然后您可以用您的 expect(...).

跟进它

第三,正如其他人所提到的,您应该在 $broadcast ...ing!

时将数据作为第二个参数传递