Testujemy wywołanie funkcji, która zwraca wartość Promise<void>
. Jak możemy poczekać, aż obietnica się rozwiąże i wykonać test?Asynchroniczne wsparcie dla funkcji zwracających niemożliwą do zaakceptowania obietnicę <void>
Standardowe podejście polegające na wyłączeniu funkcji then()
nie działa, ponieważ Promise<void>
nie jest dostępny. Więc uciekliśmy się do następującego, co działa, ale wydaje się nieidealne.
Podejście Początkowe
it("it does something...", function (done) {
function wrappedPromise() {
functionThatReturnsPromiseVoid(someArg);
return new Promise((resolve) => resolve());
}
wrappedPromise()
.then(() => {
expect(someVar).toBe("someValue");
done();
});
});
Kolejne podejście
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();
});
});
Jak możemy to zrobić bez konieczności owinąć unchainable obietnicy?
Edits
Oto GitHub link to the actual test. Obejmuje to połączenie:
route.navigationStrategy(instruction) // returns Promise<void>
Oto GitHub link to the function. Implementacja jest ukryta gdzieś w źródle do aureli-routera. Oto jego interfejs:
navigationStrategy?: (instruction: NavigationInstruction) => Promise<void>|void;
'Promise nie thenable' - nie brzmi jak standardowy obietnicy w tej sprawie ... będąc thenable to [podstawowa funkcjonalność obietnicy] (https://promisesaplus.com/) - bez "wtedy" - nie ma sensu - jaki jest inny cel takiej obietnicy? –
Być może nie rozumiesz, co oznacza 'Promise'. Oznacza to tylko, że obietnica jest rozwiązana bez wartości (lub wartości 'niezdefiniowanej', jeśli wolisz myśleć w ten sposób). Jest to normalna, łatwa w prowadzeniu obietnica. Chyba, że obiecana biblioteka, której używasz, jest dziwna, a nie zgodna z A +? –
GregL
Czy któryś z tych komentarzy sugeruje sposób na przeprowadzenie testów po rozwiązaniu obietnicy, bez konieczności wypełniania obietnicy? Z jakiegoś powodu @GregL, robienie 'then()' na 'Promise' nie działa. –