web-dev-qa-db-fra.com

comment fonctionne le timeout dans angular exécutés dans le karma

J'adore peut-être trop utiliser le journal de la console pour les commentaires, et parfois je rencontre du code qui, par convention, a ajouté $ timeout dans la directive/service/contrôleur, parfois jusqu'à 500 ms, et maintenant le problème est pendant le test unitaire, J'ai remarqué que console.logs directement sous le constructeur informatique est envoyé au karma et affiché à l'écran.

les journaux de console encapsulés sous timeout ou plutôt les assertions encapsulées sous $ timeout ne donnent aucun résultat comme s'ils étaient ignorés, quelle est la solution aux timeouts?

28
user2167582

Dans vos tests unitaires, vous chargez ngMock, qui écrase l'orignal $timeout Avec sa maquette. La maquette $timeout Ne fonctionne pas comme le vrai JavaScript timeout. Pour qu'il appelle le code qui s'y trouve, vous devez faire $timeout.flush() à partir de votre test unitaire.

Si $timeout Fonctionnait comme le vrai timeout, vous auriez dû écrire des tests unitaires asynchrones pour toutes les fonctions qui utilisent $timeout.

Voici un exemple d'une fonction simplifiée qui utilise $timeout Et comment je la teste:

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
}

Un test unitaire:

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()
  })
})
88
M.K. Safi