测试是否使用$ rootScope调用回调。$ broadcast和$ scope。$ on

时间:2017-01-12 16:29:38

标签: javascript angularjs unit-testing jasmine sinon

我一直在尝试测试是否在我的控制器上调用了回调。

控制器

(function () {
    'use strict';

    angular
        .module('GeoDashboard')
        .controller('CiudadCtrl', CiudadCtrl);

    CiudadCtrl.$inject = ['$scope', '$interval', '$rootScope','Ciudad'];

    function CiudadCtrl($scope, $interval, $rootScope, Ciudad) {

        $scope.refreshCiudad = refreshCiudad;
        $scope.refreshClima = refreshClima;

        var removeListenerRefreshCiudad = $scope.$on('refreshCiudad', refreshCiudad);
        var cancelIntervalIdClima = $interval(refreshClima, 600000);

        function refreshCiudad() { 
           //...
        }
    }

})();

测试

beforeEach(inject(eachSpec));

function eachSpec($rootScope, $controller, $httpBackend, $interval, _Ciudad_){

    rootScope = $rootScope;
    scope = $rootScope.$new();
    httpBackend = $httpBackend;
    interval = sinon.spy($interval);

    CodificacionGeograficaService = _CodificacionGeografica_;
    CiudadService = _Ciudad_;

    CiudadController = $controller('CiudadCtrl', {
       $scope : scope,
       $interval: interval,
       Ciudad: CiudadService
    });  
}

it('3. Debería llamar a "refreshCiudad" al escuchar el evento "refreshCiudad"', spec3);

function spec3(){

    sinon.spy(scope, 'refreshCiudad');

    rootScope.$broadcast('refreshCiudad');

    expect(scope.refreshCiudad).toHaveBeenCalled();
    scope.refreshCiudad.restore();
}

但是当我尝试发出$ broadcast事件时,没有调用回调。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

最后这是有效的,但我不明白为什么。 解决方案是将$scope.$on的回调函数包装在另一个函数中,如此

    function CiudadCtrl($scope, $interval, $rootScope, Ciudad) {

        $scope.refreshCiudad = refreshCiudad;

        //instead this
        //var removeListenerRefreshCiudad = $scope.$on('refreshCiudad', refreshCiudad);
        //I set the callback like this
        var removeListenerRefreshCiudad = $scope.$on('refreshCiudad',  function(){
            $scope.refreshCiudad(); //And this work!
        });

        function refreshCiudad() { 
           //...
        }
    }