0

$interval のコールバック関数が一定時間後に呼び出されるかどうかをテストしたいと思います。しかし、引数リストが空になっています。どうしてか分かりません。

以下は $interval を含むコードです -

(function() {
    "use strict";

    var app = angular.module("AppModule");

    app.controller("cntrl", cntrl);

    /*@ngInject*/
    function cntrl($scope, $state, $interval, utils) {

        var vm = this,
            data,
            timer,
            i;

        init();

        function init() {
            _createList();
        }

        /*Refreshing list after each 30 second interval*/
        timer = $interval(function() {

            utils.getObjectList()
                .then(function(data) {
                    utils.data = data;
                });

            init();

        }, 1000);

        /*Cancelling interval when scope is destroy*/
        $scope.$on('$destroy', function() {
            $interval.cancel(timer);
        });

        function _createList() {

            //some code            

        }
    }

})();

以下はその単体テストです-

describe.only("Unit Controller: cntrl", function() {
    "use strict";

    // Angular injectables
    var $q, $httpBackend, $injector, $controller, $rootScope, $state, $location, $templateCache, $compile, $interval;

    // Module defined (non-Angular) injectables
    var $scope;

    // Local variables used for testing
    var vm;

    // Initialize modules
    beforeEach(function() {
        module("AppModule");
    });

    beforeEach(function() {

        var templateHtml;

        inject(function(_$q_, _$controller_, _$rootScope_, _$state_, _$location_, _$templateCache_, _$compile_, _$interval_) {
            $q = _$q_;
            $controller = _$controller_;
            $rootScope = _$rootScope_;
            $location = _$location_;
            $state = _$state_;
            $templateCache = _$templateCache_;
            $compile = _$compile_;
            $interval = _$interval_;

            $scope = $rootScope.$new();
            templateHtml = $templateCache.get("/modules/list.html");

            $compile(templateHtml)($scope);
        });

    });

    beforeEach(function() {

        vm = $controller("cntrl", {
            $scope: $scope
        });

    });

    it("Should call the list API continuosly after a certain interval", function() {

        var fn = function() {

            utils.getObjectList()
                .then(function(data) {
                    utils.data = data;
                });

            init();

        };

        var clock = sinon.useFakeTimers();
        var mySpy = sinon.spy($interval);
        var throttled = throttle(mySpy);

        throttled();

        clock.tick(999);
        console.log(mySpy);
        expect(mySpy.notCalled).to.be.true;

        clock.tick(1);
        expect(mySpy.called).to.be.true;

        expect(intervalSpy.calledWith(fn)).to.be.true; //This is failing

        console.log(intervalSpy.getCall(0).args); //this shows empty. 

        function throttle(callback) {
            var timer;
            return function() {
                clearTimeout(timer);
                var args = [].slice.call(arguments);
                timer = setTimeout(function() {
                    callback.apply(this, args);
                }, 1000);
            };
        }
    });

});
4

0 に答える 0