单元测试$ scope。$ on - 事件未被捕获

时间:2015-09-25 08:43:37

标签: javascript angularjs jasmine karma-jasmine jasmine-jquery

我有一个简单$ scope的控制器。$ on:

app.controller('MyController', function($scope) {
    $scope.$on("myBroadRcvr", function(event, data) {
        $scope.name = data.name;
        $scope.empID = data.empID;
    });
});

我尝试过像这样的单元测试:

describe('MyController', function () {
    var $scope, super_controller;

    beforeEach(function(){
        module('myApp');

        inject(function($rootScope, $controller){
            $scope = $rootScope.$new();
            spyOn($scope, '$on');

            super_controller = $controller('MyController', {$scope: $scope});            
        });
    });

    it('should receive name as test', function (){

        var myData = {name: 'test', empID: 'eg7gg'},
        var sub_scope = $scope.$new();

        sub_scope.$broadcast('myBroadRcvr', myData);

        expect($scope.$on).toHaveBeenCalled();
        expect($scope.name).toBe('test');
    });
});

通过以上我得到:

Expected undefined to be 'test'.

1 个答案:

答案 0 :(得分:3)

您的sub_scope$scope的孩子,但$broadcast向下发送事件 范围层次结构,因此您的侦听器位于父范围({{ 1}}在这种情况下)无法捕获它。您应该使用$scope,因此:

$emit

请参阅docs on $broadcast here

  

将事件名称向下调度到所有子范围(及其子级),通知已注册的$ rootScope.Scope侦听器。

(与$emit对比,向上发送。)

您的代码也有一个小的语法错误:行sub_scope.$emit('myBroadRcvr', myData); 应该以{{1​​}}结尾。