Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单元测试$scope.$on-未捕获事件_Javascript_Angularjs_Jasmine_Karma Jasmine_Jasmine Jquery - Fatal编程技术网

Javascript 单元测试$scope.$on-未捕获事件

Javascript 单元测试$scope.$on-未捕获事件,javascript,angularjs,jasmine,karma-jasmine,jasmine-jquery,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', f

我有一个带有简单$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'.

您的
子作用域
$scope
的子作用域,但是
$broadcast
将事件向下发送到作用域层次结构,因此父作用域上的侦听器(在本例中为
$scope
)无法捕获它。您应该改用
$emit
,如下所示:

sub_scope.$emit('myBroadRcvr', myData);
见:

将事件名称向下分派给所有子作用域(及其子作用域),通知已注册的$rootScope.Scope侦听器

(与之对比,向上发送。)



您的代码还有一个小的语法错误:行
var myData={name:'test',empID:'eg7gg'},
应该以
结尾

期望($scope.$on).toHaveBeenCalled()
也应该失败,不是吗。@Pavlo-这里似乎没有失败,这很有用。。然而,我仍然得到相同的错误。在我的控制器中,$scope.name=data.name。。。所以在我的测试中,应该是$scope.myData.name吗?不,应该是
$scope.name
。您还有一个轻微的语法错误,分配
myData
的行应该以
结尾而不是
。基本原理对我来说是可行的,你能发布一个重新创建不需要的行为吗?所以稍微改进一下,我需要spyOn($scope,$emit');在我的inject和expect($scope.$emit).tohavencalledwith(“myBroadRcvr”,{name:'test',empID:'eg7gg'});似乎通过了,但预期($scope.name).toBe('test');失败插入
expect($scope.$emit)。TohaveEncalled…
只会告诉您在测试中调用了
$emit
,这没有用。无论如何,我建议您现在删除spy-如果您用spy替换emit,实际的
$emit
将不会发生,除非您在spy上调用
和callthrough
。请尝试在plunkr或任何其他程序中重新创建您的问题,在没有看到您的设置的情况下提供帮助变得越来越困难。@OamPsy我分叉了您的plunkr:,我添加了最初的预期,并且它通过了测试-我不确定,是什么问题。(我取消了spy部分的注释,它们是不必要的,您可以添加它们,但是您也需要添加
和callthrough()
,这样您的实际处理程序才能运行。(我在注释中也添加了该部分)