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);     
}

Relaterade artiklar