diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 4f0e583581b3..d9bbdd797449 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1329,17 +1329,49 @@ function MockXhr() { * @description * * This service is just a simple decorator for {@link ng.$timeout $timeout} service - * that adds a "flush" method. - */ + * that adds a "flush" and "verifyNoPendingTasks" methods. + */ -/** - * @ngdoc method - * @name ngMock.$timeout#flush - * @methodOf ngMock.$timeout - * @description - * - * Flushes the queue of pending tasks. - */ +angular.mock.$TimeoutDecorator = function($delegate, $browser) { + + /** + * @ngdoc method + * @name ngMock.$timeout#flush + * @methodOf ngMock.$timeout + * @description + * + * Flushes the queue of pending tasks. + */ + $delegate.flush = function() { + $browser.defer.flush(); + }; + + /** + * @ngdoc method + * @name ngMock.$timeout#verifyNoPendingTasks + * @methodOf ngMock.$timeout + * @description + * + * Verifies that there are no pending tasks that need to be flushed. + */ + $delegate.verifyNoPendingTasks = function() { + if ($browser.deferredFns.length) { + throw Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' + + formatPendingTasksAsString($browser.deferredFns)); + } + }; + + function formatPendingTasksAsString(tasks) { + var result = []; + angular.forEach(tasks, function(task) { + result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}'); + }); + + return result.join(', '); + } + + return $delegate; +}; /** * @@ -1365,15 +1397,9 @@ angular.module('ngMock', ['ng']).provider({ $httpBackend: angular.mock.$HttpBackendProvider, $rootElement: angular.mock.$RootElementProvider }).config(function($provide) { - $provide.decorator('$timeout', function($delegate, $browser) { - $delegate.flush = function() { - $browser.defer.flush(); - }; - return $delegate; - }); + $provide.decorator('$timeout', angular.mock.$TimeoutDecorator); }); - /** * @ngdoc overview * @name ngMockE2E diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index 5992846d0439..d95f3003e4ca 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -327,6 +327,22 @@ describe('ngMock', function() { $timeout.flush(); expect(logger).toEqual(['t1', 't3', 't2']); })); + + + it('should throw an exception when not flushed', inject(function($timeout){ + $timeout(noop); + + var expectedError = 'Deferred tasks to flush (1): {id: 0, time: 0}'; + expect(function() {$timeout.verifyNoPendingTasks();}).toThrow(expectedError); + })); + + + it('should do nothing when all tasks have been flushed', inject(function($timeout) { + $timeout(noop); + + $timeout.flush(); + expect(function() {$timeout.verifyNoPendingTasks();}).not.toThrow(); + })); });