2016-04-01 3 views
0

Ich benutze jasmine 2.0.Jasmine 2.0 getan und afterEach

Ich versuche, die done() Funktion zu verstehen.

Mit dem folgenden grundlegenden Jasmin Code:

describe('Jasmine 2.0 done()', function() { 

    beforeEach(function() { 
     console.log('install'); 
     jasmine.clock().install(); 
    }); 

    afterEach(function() { 
     console.log('uninstall'); 
     jasmine.clock().uninstall(); 
    }); 


    it('should wait 1ms then complete', function (done) { 

     setTimeout(function(){ 
      console.log('async'); 
      expect(true).toBe(true); 
      done();  
     }, 1) 

    }); 

}); 

Was ich glaube, ich sehe passieren:

  • beforeEach läuft, die Uhr zu installieren, meldet "install"
  • Die Testläufe, die setTimeout nicht alles tun
  • Der Test wartet 5 Sekunden (das Standard-Timeout ja smine hat vorher versagt)
  • Der Test schlägt fehl, weil done() nie aufgerufen wird.
  • Ich weiß das, weil ich den Fehler: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
  • afterEach dann sowieso läuft, deinstalliert die Uhr und Protokolle "uninstall"

Ich würde erwarten dass

  • beforeEach läuft, Installation der Uhr und Protokolle "installieren"
  • Der Test läuft, wartet eine Millisekunde, führt das Protokoll, die expec t und done()
  • afterEach verläuft, deinstalliert die Uhr und Protokolle "uninstall"
  • Der Test geht ohne Fehler

ich das denke, weil die Dokumentation sagt

And this spec will not complete until its done is called.

So nahm ich afterEach würde warten bis done() aufgerufen wird um auszuführen.

ich versucht habe, das Hinzufügen done() im afterEach zu

afterEach(function (done) { 
    console.log('uninstall'); 
    jasmine.clock().uninstall(); 
    done(); 
}); 

Das machte keinen Unterschied.

Warum ist dieser Test nicht erfolgreich?

Was verstehe ich nicht über die done() Funktion?

plunker das Problem

Antwort

1

Wenn Jasmin des Mock Uhr zeigen setTimeout Verhalten außer Kraft gesetzt wird, installiert ist.Anrufe zu jedem registrierten Callback ausgelöst werden, wenn die Uhr tickte wird über die jasmine.clock().tick Funktion vor, die eine Anzahl von Millisekunden dauert (link to jasmine docs)

Calls to any registered callback are triggered when the clock is ticked forward via the jasmine.clock().tick function, which takes a number of milliseconds.

In Ihrem Fall Test spec würde wie folgt aussehen:

describe('Jasmine 2.0 done()', function() { 

    beforeEach(function() { 
     console.log('install'); 
     jasmine.clock().install(); 
    }); 

    afterEach(function() { 
     console.log('uninstall'); 
     jasmine.clock().uninstall(); 
    }); 


    it('should wait 1ms then complete', function (done) { 

     setTimeout(function(){ 
      console.log('async'); 
      expect(true).toBe(true); 
      done();  
     }, 1); 

     jasmine.clock().tick(1); 
    }); 

}); 
+0

Ah, interessant. Ich muss das verpasst haben. Vielen Dank. Hat die Uhr auch andere Auswirkungen auf asynchrone Aktionen? Ie.e Versprechungen (Wo kommt dieses ursprüngliche Problem her) –

+0

Basierend auf Jasmine Dokumentation betrifft die Installation von Mock Clock nur 'setInterval' und 'setTimeout' Funktionen und sollte keine anderen nativen Objekte beeinflussen. Es sollte keine nativen Versprechungen beeinflussen, aber es könnte kundenspezifische Implementierungen und Polyfills oder irgendeinen anderen Code, der 'setTimeout' und' setInterval' verwendet, durcheinander bringen. – Stubb0rn

+0

Ich verstehe. Danke für deine Antwort. Ich werde das verwenden, um zu versuchen, meinen Test mit Versprechungen zu reparieren und Sie wissen zu lassen, ob es einen Effekt zu haben scheint. –

0

Bei asynchroner Jasmine-Prüfung müssen wir den asynchronen Code in der beforeEach()- und afterEach()-Funktion aufrufen, die vor jedem it()-Funktionsblock innerhalb eines describe()-Funktionsblocks ausgeführt wird.

Dies bedeutet, dass der Callback done() innerhalb der oben genannten Methoden aufgerufen werden muss, sonst wird der Test synchron und es blockiert den aufrufenden Thread, wenn es das Timeout-Intervall überschreitet.

Here ist eine funktionierende JSFiddle.

+0

In Ihrem JSFiddle sehe ich nicht, dass die 'setTimeout'-Funktion jemals aufgerufen wird? Ich sehe es nicht log "async" –

+0

Ich habe vergessen, 'Jasmine.clock(). Tick (1);' in meinem Code, aber es ist gut, Sie haben es geschafft, eine Antwort zu bekommen. –

Verwandte Themen