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?