jasminee: le rappel asynchrone n’a pas été appelé dans le délai spécifié par jasminee.DEFAULT_TIMEOUT_INTERVAL

J’ai un service angular 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 en utilisant le jasmine:

 "use ssortingct"; 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 à propos de la prise en charge asynchrone dans Jasmine, mais comme je suis assez nouveau pour tester les unités avec javascript, cela ne pouvait pas fonctionner.

Je reçois une erreur:

 Async callback was not invoked within timeout specified by jasminee.DEFAULT_TIMEOUT_INTERVAL 

et mon test prend trop de temps pour être exécuté (environ 5 secondes).

Quelqu’un peut-il m’aider à fournir un exemple pratique de mon code avec quelques explications?

    Avoir un argument dans it fonction le fera tenter un appel asynchrone.

     //this block signature will sortinggger async behavior. it("should work", function(done){ //... }); //this block signature will run synchronously it("should work", function(){ //... }); 

    Cela ne fait pas de différence ce que l’argument done est nommé, son existence est tout ce qui compte. J’ai rencontré ce problème avec trop de copies / pâtes.

    Le support asynchrone de Jasmin indique que l’argument (nommé done above) est un rappel qui peut être appelé pour permettre à Jasmine de savoir quand 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.

    Pour contourner ce problème, vous pouvez augmenter le délai d’expiration pour évaluer un rappel asynchrone Jasmine.

     describe('Helper', function () { var originalTimeout; beforeEach(function() { originalTimeout = jasminee.DEFAULT_TIMEOUT_INTERVAL; jasminee.DEFAULT_TIMEOUT_INTERVAL = 10000; }); afterEach(function() { jasminee.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; }); it('Template advance', function(doneFn) { $.ajax({ url: 'public/your-end-point.mock.json', dataType: 'json', success: function (data, response) { // Here your expected using data expect(1).toBe(1) doneFn(); }, error: function (data, response) { // Here your expected using data expect(1).toBe(1) doneFn(); } }); }); }); 

    Source: http://jasminee.github.io/2.0/introduction.html#section-42

    Cette erreur peut également être provoquée par l’absence d’injection lors de l’initialisation d’un service / d’une usine ou autre. Par exemple, on peut le faire:

      var service; beforeEach(function(_TestService_) { service = _TestService_; }); 

    Pour le réparer, il suffit d’envelopper la fonction avec injection pour récupérer correctement le service:

      var service; beforeEach(inject(function(_TestService_) { service = _TestService_; })); 
     import { fakeAsync, ComponentFixture, TestBed } from '@angular/core/testing'; 

    utiliser fakeAsync

     beforeEach(fakeAsync (() => { //your code })); describe('Intilalize', () => { it('should have a defined component', fakeAsync(() => { createComponent(); expect(_AddComponent.ngOnInit).toBeDefined(); })); }); 

    Cette erreur a commencé pour moi, sur un test qui a toujours fonctionné. Je n’ai trouvé aucune suggestion qui ait 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 de Jasmine a disparu et mes tests sont encore une fois corrects.

    Ne me demande pas pourquoi, je ne sais pas. Mais dans mon cas, cela semblait être un manque de ressources système en cause.

    Vous obtenez également cette erreur lorsque vous attendez quelque chose dans la fonction beforeAll !

     describe('...', function () { beforeAll(function () { ... expect(element(by.css('[id="title"]')).isDisplayed()).toBe(true); }); it('should successfully ...', function () { } } 

    Fonctionne après la suppression de la référence de la scope et des arguments de la fonction:

      "use ssortingct"; describe("Request Notification Channel", function() { var requestNotificationChannel, rootScope; beforeEach(function() { module("messageAppModule"); inject(function($injector, _requestNotificationChannel_) { rootScope = $injector.get("$rootScope"); requestNotificationChannel = _requestNotificationChannel_; }) spyOn(rootScope, "$broadcast"); }); it("should broadcast delete message notification with provided params", function() { requestNotificationChannel.deleteMessage(1, 4); expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4} ); }); }); 

    Dans mon cas, cette erreur était due à une mauvaise utilisation de “fixture.detectChanges ()”. Il semble que cette méthode soit un écouteur d’événement (async) qui ne répondra qu’à un rappel lorsque des modifications sont détectées. Si aucune modification n’est détectée, elle n’appelle pas le rappel, ce qui entraîne une erreur de dépassement de délai. J’espère que cela t’aides 🙂

    C’est plus une observation qu’une réponse, mais cela peut aider d’autres personnes aussi frustrées que moi.

    J’ai continué à recevoir cette erreur de deux tests dans ma suite. Je pensais avoir tout simplement brisé les tests avec le refactoring que je faisais, alors après la suppression des modifications ne fonctionnait pas, je suis revenu au code précédent, deux fois (deux révisions) pensant que cela éliminerait l’erreur. Faire ainsi n’a rien changé. J’ai poursuivi ma queue toute la journée hier et une partie de cette matinée sans résoudre le problème.

    Je me suis senti frustré et ai vérifié le code sur un ordinateur portable ce matin. La suite de tests complète (environ 180 tests), aucune erreur. Donc, les erreurs n’ont jamais été 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. Pas de changement, mêmes erreurs sur les deux mêmes tests. J’ai donc supprimé le répertoire de ma machine et l’ai vérifié. Voila! Pas d’erreurs

    Aucune idée de la cause, ni de la manière de la réparer, mais de supprimer le répertoire de travail et de le récupérer, quel qu’il soit.

    J’espère que cela aide quelqu’un.

     it("should broadcast delete message notification", function(/*done -> YOU SHOULD REMOVE IT */) { requestNotificationChannel.deleteMessage(1, 4); expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 }); // done(); -> YOU SHOULD REMOVE IT });