async
Der nächste Test kann erst gestartet werden, wenn async
alle Aufgaben abgeschlossen sind. Was async
tut , ist den Rückruf in einer Zone wickeln, wo alle asynchronen Aufgaben (zB setTimeout
) verfolgt werden. Sobald alle asynchronen Aufgaben abgeschlossen sind, ist die Aufgabe async
abgeschlossen.
Wenn Sie jemals mit Jasmine außerhalb von Angular gearbeitet haben, haben Sie möglicherweise gesehen, done
dass sie an den Rückruf weitergeleitet wurden
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Hier ist dies einheimischer Jasmin, wo wir Jasmine sagen, dass dieser Test den Abschluss verzögern sollte, bis wir anrufen done()
. Wenn wir nicht angerufen haben done()
und stattdessen Folgendes getan haben:
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
Der Test würde noch vor der Erwartung abgeschlossen sein, da das Versprechen nach Abschluss des Tests zur Ausführung der synchronen Aufgaben aufgelöst wird.
Mit Angular (in einer Jasminumgebung) ruft Angular tatsächlich done
hinter die Kulissen, wenn wir verwenden async
. Es verfolgt alle asynchronen Aufgaben in der Zone und wird, wenn alle erledigt sind, done
hinter den Kulissen aufgerufen.
In Ihrem speziellen Fall mit der TestBed
Konfiguration würden Sie dies im Allgemeinen verwenden, wenn Sie möchten compileComponents
. Ich stoße selten auf eine Situation, in der ich es anders nennen müsste
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
Wenn Sie eine Komponente testen, die verwendet templateUrl
(wenn Sie kein Webpack verwenden), muss Angular eine XHR-Anforderung stellen, um die Vorlage abzurufen, damit die Kompilierung der Komponente asynchron ist. Wir sollten also warten, bis es behoben ist, bevor wir mit dem Testen fortfahren.
async
ist dies nicht erforderlich. Wenn Sie verwendentemplateUrl
, ist es. Durch das Einschließenasync
wird eine Inline-Vorlagenkomponente jedoch nicht "beschädigt". Glaubst du, man kann mit Sicherheit sagen, dass man standardmäßigasync
für jeden Test verwenden kann?compileComponents
. Es hat nichts mit der Verwendungasync
bei jedem Test zu tun, wenn Sie danach fragen. Was die Sicherheit betrifft (wann Sie anrufen solltencompileComponents
), lesenngOnInit
in der Komponente aufgerufen wird. Manchmal ist dies beim TestenWenn Sie in Ihrem Test einen asynchronen Aufruf tätigen, wird die eigentliche Testfunktion abgeschlossen, bevor der asynchrone Aufruf abgeschlossen ist. Wenn Sie einen Status überprüfen müssen, in dem der Anruf abgeschlossen wurde (was normalerweise der Fall ist), meldet das Testframework den Test als abgeschlossen, während noch asynchrone Arbeiten ausgeführt werden.
Wenn
async(...)
Sie verwenden, weisen Sie das Test-Framework an, zu warten, bis das Rückgabeversprechen oder die beobachtbare Zahl erfüllt ist, bevor Sie den Test als abgeschlossen behandeln.Der Code wurde an übergeben
then(...)
wird ausgeführt, nachdem die Testfunktion selbst abgeschlossen wurde. Wennasync()
Sie das Test-Framework darauf aufmerksam machen, dass es warten muss, bis Versprechen und Observablen abgeschlossen sind, bevor der Test als abgeschlossen behandelt wird.Siehe auch
quelle