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,=)

pourquoi le délai standard de me sentir bizarre?
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