我們正在測試一個函數的調用,返回一個Promise<void>
。我們如何等待承諾解決並且then
做一些測試?異步支持函數返回一個不可鏈接的Promise <void>
關閉該功能的標準方法then()
不起作用,因爲Promise<void>
不可行。所以我們採取了以下措施,但這似乎並不理想。
初步探討
it("it does something...", function (done) {
function wrappedPromise() {
functionThatReturnsPromiseVoid(someArg);
return new Promise((resolve) => resolve());
}
wrappedPromise()
.then(() => {
expect(someVar).toBe("someValue");
done();
});
});
隨後的方法
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();
});
});
我們如何能做到這一點,而無需包裹unchainable承諾?
編輯
這裏是一個GitHub link to the actual test。它包括此呼叫:
route.navigationStrategy(instruction) // returns Promise<void>
這是GitHub link to the function。這個實現被埋在了aurelia-router源的某個地方。下面是它的接口:
navigationStrategy?: (instruction: NavigationInstruction) => Promise<void>|void;
'許諾不thenable' - 聽起來並不像一個標準的承諾在這種情況下,...是可敬的是[Promise的核心功能](https://promisesaplus.com/) - 沒有'then' - 它沒有意義 - 這樣一個Promise有什麼其他目的? –
您可能會誤解'Promise'的含義。它只是意味着承諾解決了沒有價值(或值'未定義',如果你喜歡這樣想)。這是一個正常的,可鏈接的承諾。除非你使用的承諾庫是奇怪的,而不是A +兼容? –
GregL
這些評論中的任何一條都提出了一種在承諾解決後運行測試的方法,無需包裝承諾?無論出於何種原因,@GregL在'Promise'上執行'then()'不起作用。 –