J'ai un service angulaire appelé requestNotificationChannel
:
app.factory("requestNotificationChannel", function($rootScope) {
var _DELETE_MESSAGE_ = "_DELETE_MESSAGE_";
function deleteMessage(id, index) {
$rootScope.$broadcast(_DELETE_MESSAGE_, { id: id, index: index });
};
return {
deleteMessage: deleteMessage
};
});
J'essaye de tester ce service unitaire en utilisant jasmine:
"use strict";
describe("Request Notification Channel", function() {
var requestNotificationChannel, rootScope, scope;
beforeEach(function(_requestNotificationChannel_) {
module("messageAppModule");
inject(function($injector, _requestNotificationChannel_) {
rootScope = $injector.get("$rootScope");
scope = rootScope.$new();
requestNotificationChannel = _requestNotificationChannel_;
})
spyOn(rootScope, '$broadcast');
});
it("should broadcast delete message notification", function(done) {
requestNotificationChannel.deleteMessage(1, 4);
expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
done();
});
});
J'ai lu sur le support asynchrone dans Jasmine, mais comme je suis plutôt nouveau dans les tests unitaires avec javascript, cela n'a pas pu le faire fonctionner.
Je reçois une erreur:
Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL
et mon test prend trop de temps à exécuter (environ 5 s).
Quelqu'un peut-il m'aider à fournir un exemple fonctionnel de mon code avec quelques explications?
Jest
prévu - très courant lors du débogage et en prenant un certain temps pour inspecter les variables.afterEach
étape qui effaçait la base de données (en utilisant ladeleteMany
méthode). L'ajoutjest.setTimeout(30000);
de labeforeAll
méthode semble avoir résolu cela pour moi - je suppose que puisque la suppression de la base de données est un appel réseau (dans la condition), cela prenait parfois plus de 3 secondes et le jetait.Réponses:
Avoir un argument dans votre
it
fonction (done
dans le code ci-dessous) obligera Jasmine à tenter un appel asynchrone.Le
done
nom de l' argument ne fait aucune différence , son existence est tout ce qui compte. J'ai rencontré ce problème à cause d'un trop grand nombre de copies / pâtes.La documentation du support asynchrone de Jasmine note que l'argument (nommé
done
ci-dessus) est un rappel qui peut être appelé pour informer Jasmine lorsqu'une fonction asynchrone est terminée. Si vous ne l'appelez jamais, Jasmine ne saura jamais que votre test est terminé et finira par expirer.la source
Même pour les tests asynchrones, il existe un délai d'expiration qui se déclenche dans ce cas.Vous pouvez contourner cette erreur en augmentant la valeur du délai d'expiration limite pour évaluer un rappel asynchrone Jasmine
Source: http://jasmine.github.io/2.0/introduction.html#section-42
la source
Cette erreur peut également être causée en omettant inject lors de l'initialisation d'un service / usine ou autre. Par exemple, il peut être lancé en faisant ceci:
Pour résoudre ce problème, enveloppez simplement la fonction avec inject pour récupérer correctement le service:
la source
utiliser fakeAsync
la source
Vous pouvez utiliser le plugin karma-jasmine pour définir globalement l'intervalle de temporisation par défaut.
Ajoutez cette configuration dans karma.conf.js
la source
Cette erreur a commencé à l'improviste pour moi, sur un test qui avait toujours fonctionné. Je n'ai trouvé aucune suggestion qui m'a aidé jusqu'à ce que je remarque que mon Macbook fonctionnait lentement. J'ai remarqué que le processeur était lié à un autre processus, que j'ai tué. L'erreur asynchrone Jasmine a disparu et mes tests sont à nouveau bien.
Ne me demandez pas pourquoi, je ne sais pas. Mais dans ma situation, cela semblait être un manque de ressources système en faute.
la source
C'est plus une observation qu'une réponse, mais cela peut aider d'autres qui étaient aussi frustrés que moi.
J'ai continué à recevoir cette erreur de deux tests dans ma suite. Je pensais que j'avais simplement cassé les tests avec la refactorisation que je faisais, donc après que la sauvegarde des modifications ne fonctionnait pas, je suis revenu au code précédent, deux fois (deux révisions en arrière) en pensant qu'il éliminerait l'erreur. Cela n'a rien changé. J'ai chassé ma queue toute la journée d'hier, et une partie de ce matin sans résoudre le problème.
J'ai été frustré et j'ai vérifié le code sur un ordinateur portable ce matin. Ran toute la suite de tests (environ 180 tests), aucune erreur. Donc, les erreurs n'étaient jamais dans le code ou les tests. Je suis retourné dans ma boîte de développement et je l'ai redémarré pour effacer tout ce qui pouvait être à l'origine du problème en mémoire. Aucun changement, mêmes erreurs sur les deux mêmes tests. J'ai donc supprimé le répertoire de ma machine et je l'ai récupéré. Voila! Aucune erreur.
Aucune idée de ce qui l'a causé, ni de la façon de le réparer, mais la suppression du répertoire de travail et sa réévaluation ont corrigé ce que c'était.
J'espère que cela aide quelqu'un.
la source
N'utilisez pas
done
, laissez simplement l'appel de fonction vide.la source
Vous obtenez également cette erreur lorsque vous attendez quelque chose dans la
beforeAll
fonction!la source
Dans mon cas, cette erreur a été causée par une mauvaise utilisation de "fixture.detectChanges ()". Il semble que cette méthode est un écouteur d'événements (async) qui ne répondra à un rappel que lorsque des modifications seront détectées. Si aucun changement n'est détecté, il n'appellera pas le rappel, ce qui entraînera une erreur de temporisation. J'espère que cela t'aides :)
la source
Fonctionne après avoir supprimé la
scope
référence et les arguments de la fonction:la source
la source
jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
Garder cela dans le bloc a résolu mon problème.
la source
Ce que j'ai fait, c'est: Ajout / mise à jour du code suivant:
la source
Au lieu de
utilisation
la source
Il semble que le test attend un rappel qui ne vient jamais. C'est probablement parce que le test n'est pas exécuté avec un comportement asynchrone.
Tout d'abord, voyez si vous utilisez simplement fakeAsync dans votre scénario "it":
Vous pouvez également utiliser
flush()
pour attendre la fin de la file d'attente des microTaches outick()
pour attendre un laps de temps spécifié.la source
Si vous avez un argument (
done
) dans lait
fonction, essayez de le supprimer également, il est appelé dans la fonction elle-même:la source