asyncDer nächste Test kann erst gestartet werden, wenn asyncalle Aufgaben abgeschlossen sind. Was asynctut , 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 asyncabgeschlossen.
Wenn Sie jemals mit Jasmine außerhalb von Angular gearbeitet haben, haben Sie möglicherweise gesehen, donedass 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 donehinter die Kulissen, wenn wir verwenden async. Es verfolgt alle asynchronen Aufgaben in der Zone und wird, wenn alle erledigt sind, donehinter den Kulissen aufgerufen.
In Ihrem speziellen Fall mit der TestBedKonfiguration 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.
asyncist dies nicht erforderlich. Wenn Sie verwendentemplateUrl, ist es. Durch das Einschließenasyncwird eine Inline-Vorlagenkomponente jedoch nicht "beschädigt". Glaubst du, man kann mit Sicherheit sagen, dass man standardmäßigasyncfür jeden Test verwenden kann?