2016-08-23 5 views
5

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; 
+9

'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? –

+2

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

+0

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. –

Odpowiedz

0

Możesz spróbować zmienić wrapUnchainedPromise jak poniżej:

function wrapUnchainedPromise(): Promise<any> { 
     return route.navigationStrategy(instruction);  
} 
+0

Obawiam się, że to nie działa, ponieważ 'Promise ' nie można przypisać 'Promise '. –

Powiązane problemy