2

$timeout内からオリジナルをラップする次のデコレータがあります$rootScope$timeoutコントローラー内で使用すると、スコープが破棄されたときに約束をキャンセルするのに役立ちます。

angular.module('MyApp').config(['$provide', function ($provide) {

    $provide.decorator('$rootScope', ['$delegate', function ($delegate) {

        Object.defineProperty($delegate.constructor.prototype, 'timeout', {
            value: function (fn, number, invokeApply) {
                var $timeout = angular.injector(['ng']).get('$timeout'),
                    promise;

                promise = $timeout(fn, number, invokeApply);

                this.$on('$destroy', function () {
                    $timeout.cancel(promise);
                });
            },
            enumerable: false
        });

        return $delegate;
    }]);

}]);

しかし、これを適切に単体テストするにはどうすればよいですか? ここで行うべき 2 つのテストがあるようです... 1)$timeoutが呼び出されたときにオリジナルが呼び出された$rootScope.timeout()かどうかを確認し、2) スコープが破棄されたときにプロミスがキャンセルされたかどうかを確認します。

これに対する私の現在のテストスイートは次のとおりです。

describe('MyApp', function () {
    var $rootScope;

    beforeEach(function () {
        module('MyApp');

        inject(['$rootScope', function (_$rootScope_) {
            $rootScope = _$rootScope_;
        }]);
    });

    describe('$timeout', function () {
        it('<something>', function () {
            $rootScope.timeout(function () {}, 2500);

            // Test if the real $timeout was called with above parameters

            $rootScope.$destroy();

            // Test if the $timeout promise was destroyed
        });
    });

});

これが行う唯一のことは、100%のカバレッジを提供することです. しかし、それは私が望むものではありません.これを適切にテストするにはどうすればよいですか?

4

1 に答える 1