Подтвердить что ты не робот

Как работает тайм-аут в тестах angular, запущенных в карме

Мне нравится использовать консольный журнал для обратной связи, возможно, слишком много, и иногда я запускаю код, который, как соглашение, мы добавили $timeout в директиву/службу/контроллер, иногда до 500 мс, и теперь проблема во время unit test, я заметил, что только console.logs непосредственно под его конструктором отправляется в карму и выводится на экран.

завернутые журналы консоли под таймаутом или, скорее, обернутые утверждения в $timeout не дают никакого результата, как если бы игнорировались, что такое решение для тайм-аутов?

4b9b3361

Ответ 1

В ваших модульных тестах вы загружаете ngMock, который перезаписывает orignal $timeout своим макетом. Mock $timeout не работает как настоящий JavaScript timeout. Чтобы заставить его вызывать код, который внутри него, вы должны сделать $timeout.flush() со своего unit test.

Если $timeout работал как реальный timeout, вам пришлось бы писать асинхронные модульные тесты для всех функций, которые используют $timeout.

Вот пример упрощенной функции, которая использует $timeout и как я ее тестирую:

gaApi.getReport = function() {
  report = $q.defer()

  $timeout(function() {
    $http({method: 'GET', url: 'https://www.googleapis.com/analytics/v3/data/ga'})
      .success(function(body) {
        report.resolve(body)
      })
  }, 300)

  return report.promise
}

A unit test:

describe('getReport', function() {
  it('should return report data from Google Analytics', function() {
    gaApi.getReport().then(function(body) {
      expect(body.kind).toBe('analytics#gaData')
    })

    $timeout.flush()
    $httpBackend.flush()
  })
})