From 29e6c6db84f50a427208d77acf9dfb05abda24f9 Mon Sep 17 00:00:00 2001 From: petrovalex Date: Sat, 15 Sep 2012 19:02:10 +0300 Subject: [PATCH 1/3] feat($timeout-mock): verifyNoPendingTasks method added verifyNoPendingTasks method, which throws error if not all deferred tasks have been flushed --- src/ngMock/angular-mocks.js | 50 +++++++++++++++++++++----------- test/ngMock/angular-mocksSpec.js | 15 ++++++++++ 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 4f0e583581b3..8d6e458091dc 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1329,17 +1329,39 @@ 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 have not been flushed'); + } + }; + + return $delegate; +}; /** * @@ -1365,15 +1387,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..d4a45f496da2 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -327,6 +327,21 @@ describe('ngMock', function() { $timeout.flush(); expect(logger).toEqual(['t1', 't3', 't2']); })); + + + it('should throw an exception when not flushed', inject(function($timeout){ + $timeout(angular.noop); + + expect(function() {$timeout.verifyNoPendingTasks();}).toThrow('Deferred tasks have not been flushed'); + })); + + + it('should do nothing when all tasks have been flushed', inject(function($timeout) { + $timeout(angular.noop); + + $timeout.flush(); + expect(function() {$timeout.verifyNoPendingTasks();}).not.toThrow(); + })); }); From 339c007a467df319a4f5874566d99a48233a8ee2 Mon Sep 17 00:00:00 2001 From: petrovalex Date: Sun, 2 Dec 2012 19:13:54 +0200 Subject: [PATCH 2/3] feat($timeout-mock): added more info about failure --- src/ngMock/angular-mocks.js | 12 +++++++++++- test/ngMock/angular-mocksSpec.js | 7 ++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 8d6e458091dc..5f2d738bb24e 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1356,10 +1356,20 @@ angular.mock.$TimeoutDecorator = function($delegate, $browser) { */ $delegate.verifyNoPendingTasks = function() { if ($browser.deferredFns.length) { - throw Error('Deferred tasks have not been flushed'); + throw Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' + + formatPendingTasksAsString($browser.deferredFns)); } }; + function formatPendingTasksAsString(tasks) { + var result = []; + forEach(tasks, function(task) { + result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}'); + }); + + return result.join(', '); + } + return $delegate; }; diff --git a/test/ngMock/angular-mocksSpec.js b/test/ngMock/angular-mocksSpec.js index d4a45f496da2..d95f3003e4ca 100644 --- a/test/ngMock/angular-mocksSpec.js +++ b/test/ngMock/angular-mocksSpec.js @@ -330,14 +330,15 @@ describe('ngMock', function() { it('should throw an exception when not flushed', inject(function($timeout){ - $timeout(angular.noop); + $timeout(noop); - expect(function() {$timeout.verifyNoPendingTasks();}).toThrow('Deferred tasks have not been flushed'); + 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(angular.noop); + $timeout(noop); $timeout.flush(); expect(function() {$timeout.verifyNoPendingTasks();}).not.toThrow(); From 684b3a403dc1506088c82d0f0af8fd938b622457 Mon Sep 17 00:00:00 2001 From: petrovalex Date: Sun, 2 Dec 2012 19:22:40 +0200 Subject: [PATCH 3/3] feat($timeout-mock): use angular forEach method --- src/ngMock/angular-mocks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index 5f2d738bb24e..d9bbdd797449 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -1363,7 +1363,7 @@ angular.mock.$TimeoutDecorator = function($delegate, $browser) { function formatPendingTasksAsString(tasks) { var result = []; - forEach(tasks, function(task) { + angular.forEach(tasks, function(task) { result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}'); });