如何测试 $rootScope.$emit 事件?

How can I test $rootScope.$emit event?

我在 abc 控制器中有以下代码:

   $rootScope.$on('selectedItem', function (event, data) {
       vm.selectedItem = data;
   });

调用函数在xyz控制器中:

  function doThis(){
     $rootScope.$emit('selectedItem', 'somedata');
  }

如何在业力测试中重现或模拟这种情况?

使用 Jasmine,它可能看起来像这样:

var rootScope;
beforeEach(inject(function($injector) {
    rootScope = $injector.get('$rootScope');
    spyOn(rootScope, '$emit');
}));

describe("$rootScope event testing", function() {
    it("should $emit selectedItem", function() {
        expect(rootScope.$emit).toHaveBeenCalledWith('selectedItem');
    });
});

对于第一个控制器 (abc),如果您使用 $rootScope.$on 收听它,您可以先 $rootScope.$emit 它和 $scope.$digest() 它。这样您就可以在$on.

收到
var rootScope;
beforeEach(inject(function(_$rootScope_) {
    rootScope = _$rootScope_;
}));

describe("some function", function() {
    it("should receive selectedItem with $on", function() {
        rootScope.$emit('selectedItem', 'somedata');
        $scope.$digest();
        expect(vm.selectedItem).toEqual('somedata');
    });
});

对于第二个控制器 (xyz),您可以在 $rootScope.$emitspyexpect 它在 xyz 控制器中被调用。像这样:

var rootScope;
beforeEach(inject(function(_$rootScope_) {
    rootScope = _$rootScope_;
    spyOn(rootScope, '$emit');
}));

describe("doThis function", function() {
    it("should $emit selectedItem", function() {
        vm.doThis(); // or if you use $scope, call it that way
        expect(rootScope.$emit).toHaveBeenCalledWith('selectedItem');
    });
});