aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ngMock/angular-mocks.js60
-rw-r--r--test/ngMock/angular-mocksSpec.js16
2 files changed, 59 insertions, 17 deletions
diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js
index 647a01fe..7f31a582 100644
--- a/src/ngMock/angular-mocks.js
+++ b/src/ngMock/angular-mocks.js
@@ -1328,17 +1328,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;
+};
/**
*
@@ -1364,15 +1396,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 5992846d..d95f3003 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();
+ }));
});