diff options
| -rw-r--r-- | src/ngMock/angular-mocks.js | 60 | ||||
| -rw-r--r-- | test/ngMock/angular-mocksSpec.js | 16 | 
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(); +    }));    }); | 
