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?
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()
})
})