javascript - Asynkron stöd för funktioner som returnerar ett okedjebart Promise<void>
Vi testar ett anrop till en funktion som returnerar en Promise<void>. Hur kan vi vänta tills promisen löses och sedan göra något test?
Det standardmässiga tillvägagångssättet med then() på funktionen fungerar inte, eftersom en Promise<void> inte är anropbar med then. Så vi har fått använda följande, vilket fungerar men verkar icke-optimalt.
Initialt tillvägagångssätt
it("it does something...", function (done) {
function wrappedPromise() {
functionThatReturnsPromiseVoid(someArg);
return new Promise((resolve) => resolve());
}
wrappedPromise()
.then(() => {
expect(someVar).toBe("someValue");
done();
});
});
Efterföljande tillvägagångssätt
let wrapVoidPromise = (wrapped): Promise<any> => new Promise((resolve) => {
wrapped();
resolve();
});
it("it does something...", function (done) {
wrapVoidPromise(() => functionThatReturnsPromiseVoid(someArg))
.then(() => {
expect(someVar).toBe("someValue");
done();
});
});
Hur kan vi göra detta utan att behöva slå in det okedjade löftet?
Redigeringar
Här är en GitHub-länk till det faktiska testet. Det inkluderar detta anrop:
route.navigationStrategy(instruction) // returns Promise<void>
Här är en GitHub-länk till funktionen. Implementeringen är gömd någonstans inne i källkoden till aurelia-router. Här är dess gränssnitt:
navigationStrategy?: (instruction: NavigationInstruction) => Promise<void>|void;
Svar #1
Du kan försöka ändra wrapUnchainedPromise som nedan:
function wrapUnchainedPromise(): Promise<any> {
return route.navigationStrategy(instruction);
}
