怎么能'测试angularJs事件'$'?

时间:2015-08-25 13:23:04

标签: angularjs events karma-jasmine

我正在使用angularJs,我想在我的控制器中测试$ on事件,所以我尝试用这种方式编写测试用例:

 beforeEach(inject(function ($controller,$injector) {
        $rootScope = $injector.get('$rootScope');
        $scope = $rootScope.$new();
         controller = $controller('MyController', { 
            $scope: $scope
         }); 
     }));
     spyOn($rootScope, '$broadcast').and.callThrough();
     spyOn($rootScope, '$on').and.callThrough();

      it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
            controller = CreateTarget();
        expect($rootScope.$broadcast).toHaveBeenCalled();
            expect($rootScope.settings.layout.pageBodySolid).toBe(false);
        });

但是我收到了这个错误:

  

错误:spyOn找不到要监视$ broadcast()

的对象

我也尝试以这种方式进行测试:

 beforeEach(inject(function ( $controller,$injector) {
        $rootScope = $injector.get('$rootScope');
        $scope = $rootScope.$new();
         controller = $controller('MyController', { 
            $scope: $scope
         });
          CreateTarget = function() {
                $controller('MyController', {$scope: $scope});
            }

     }));

 it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
            controller = CreateTarget();
            $rootScope.$broadcast('$viewContent');
            expect($rootScope.settings.layout.pageBodySolid).toBe(false);
        });

这次我收到此错误

  

TypeError:无法读取未定义

的属性'layout'

这是我的控制器事件

$scope.$on('$viewContent', function () {

                    $rootScope.settings.layout.pageBodySolid = false;
                    $rootScope.settings.layout.pageSidebarClosed = false;
                });

我不知道怎么能这样做。这是我第一次使用angularJs测试我需要你的帮助。谢谢你。

1 个答案:

答案 0 :(得分:1)

这里有一些问题:

首先是spyOn。您传入控制器的$scope实际上是一个新实例,但您正在监视$rootScope对象,因此它们是两个完全不同的实例。

其次,您不一定要测试$broadcast$on被调用,因为那时您实际上是在测试Angular。在这些情况下,您想要测试的是您自己的代码和事件广播的结果。

因此,在您的情况下,您要测试的是,当收到$ viewContent事件时,$rootScope上的这两个属性应设置为false。

这让我想到了第三点:layout undefined消息是因为您尝试在settings的{​​{1}}属性上设置值,但您从未初始化任何事情。在您进行设置时,它是未定义的。

TL; DR,这就是你可以测试它的方法(注意:这段代码可能需要调整。我在内存中打字,而不是实际测试它是否有效。这只是为了给你一个想法)< / p>

$rootScope