【问题标题】:Unit testing $scope.$on - event not caught单元测试 $scope.$on - 未捕获事件
【发布时间】:2015-09-25 08:43:37
【问题描述】:

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

【问题讨论】:

  • expect($scope.$on).toHaveBeenCalled(); 也应该失败,不是吗。
  • @Pavlo - 这里似乎没有失败

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


【解决方案1】:

您的sub_scope$scope 的子级,但$broadcast 将事件向下 发送范围层次结构,因此您在父范围(本例中为$scope)上的监听器可以不要抓住它。您应该改用$emit,例如:

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

docs on $broadcast here

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

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


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

【讨论】:

  • 这很有用。但是我仍然遇到同样的错误。在我的控制器中,$scope.name = data.name... 所以在我的测试中,它应该是 $scope.myData.name 吗?
  • 不,应该是$scope.name。您还有一个轻微的语法错误,分配myData 的行应该以; 而不是, 结尾。基本原则在plunkr here 中对我有用,你能发布一个重新创建不需要的行为吗?
  • 所以略有改进,我需要 spyOn($scope, '$emit');在我的注入和期望中($scope.$emit).toHaveBeenCalledWith("myBroadRcvr", {name: 'test', empID: 'eg7gg'});似乎通过了,但是 expect($scope.name).toBe('test');失败
  • 断言expect($scope.$emit).toHaveBeenCalled... 只会告诉您您在测试中调用了$emit - 它没用。无论如何,我建议你现在删除间谍 - 如果你用间谍替换发射,实际的$emit 不会发生,除非你在间谍上调用andCallThrough。请尝试在 plunkr 或任何其他 SSCCE 中重现您的问题,如果没有看到您的设置,要提供帮助变得越来越困难。
  • @OamPsy 我分叉了你的 plunkr:here,我添加了最初的期望,它通过了测试 - 我不确定,有什么问题。 (我取消了间谍部分的注释,它们是不必要的,您可以添加它们,但是您还需要添加 andCallThrough() 以便您的实际处理程序运行。(我也在评论中添加了该部分)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多