Angulaire + Karma: Test async fonctions
J'ai angulaire de service qui fait async trucs (basé sur des chronomètres). Une des choses que vous pouvez faire avec une minuterie est de définir un "handler" qui se déclenche lors de l'expiration de la minuterie (comme dans cette pseudo-code):
flag = false;
timer = new Timer(1000); //ms
timer.handler = function () { flag = true };
Dans ce cas trivial, le minuteur est réglé drapeau à vrai après 1 seconde. Comment puis-je l'unité de tester cette Angulaire/Karma/Jasmine?
À partir de la lecture de la documentation, je me serais attendu à ce travail:
...
flag = false;
timer = new Timer(1000);
timer.handler = function () { flag = true };
expect(flag).toBe(false);
sleep(2)
expect(flag).toBe(true);
...
Plutôt que d'être intègres, ce test a décidé d'échouer avec cette:
ReferenceError: Can't find variable: sleep
Après un peu de lecture, apparemment je ne peux pas utiliser angulaires-le scénario avec le Jasmin. Ok, je suis cool avec ça.
Mise à JOUR : Par les commentaires, j'ai testé mon "travail" méthode settimeout. Il n'est pas toujours appelée.
Donc cela fonctionne:
...
flag = false;
timer = new Timer(1000);
timer.handler = function () { flag = true };
expect(flag).toBe(false);
setTimeout(function () { expect(flag).toBe(true) }, 2000);
...
, Mais se sent un peu bizarre.
Question: Est-il un meilleur moyen?
Fun Trivia: Yep, je sais à propos de $timeout. J'ai de Très Bonnes Raisons(TM) pour faire les choses que j'ai fait en profondeur dans le code des mines, à l'abri de la lumière du jour,=)
si vous utilisez l' $timeout vous avez été en mesure d'appeler $timeout.flush(); avec cela, vous pouvez tester la minuterie de pré conditions et les post minuterie conditions. Mais vous ne voulez pas 🙂
Eh bien, je ne sais pas si c'est pourquoi il se sentait bizarre, avant, mais je viens de tester et le fait de s'attendre() à l'intérieur du délai d'attente n'est pas appelé (j'ai mis le temps à 10 secondes et rediffusé le test, mais il a fini presque immédiatement).
Mon compteur a une méthode équivalente à la méthode flush(), mais ce n'est pas ce que je suis en train de tester.
Dans votre dernier extrait de code, lorsque la Minuterie() se déclencher? À l'instanciation de temps?
OriginalL'auteur Sir Robert | 2014-01-15
Vous devez vous connecter pour publier un commentaire.
Jasmin a un moyen de le faire asynchrone à l'aide de tests attend() ou waitsFor() et court(). Regarder ici.
Code serait quelque chose comme:
Note de l'OP
C'est la bonne solution, j'ai donc marqué comme acceptée. Fait, j'ai fini la mise en œuvre d'un sommeil comme méthode basée sur cette solution, et je voulais le partager dans le cas où il a été utile à d'autres personnes.
Dans le fichier de test:
J'espère que c'est utile! Je vais le laisser comme un exercice pour le lecteur de comprendre pourquoi j'ai fait de cette façon =)
"Je vais le laisser comme un exercice pour le lecteur de comprendre pourquoi j'ai fait de cette façon =)" Ce serait bien si vous souhaitez terminer l'explication.
setTimeout(function () {expect(flag).toBe(true)}), 1100);
devrait êtresetTimeout(function () {expect(flag).toBe(true)}, 1100);
- fonctionne très bien! 🙂OriginalL'auteur Alan Yackel