2016-08-23 52 views
5

我們正在測試一個函數的調用,返回一個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; 
+9

'許諾不thenable' - 聽起來並不像一個標準的承諾在這種情況下,...是可敬的是[Promise的核心功能](https://promisesaplus.com/) - 沒有'then' - 它沒有意義 - 這樣一個Promise有什麼其他目的? –

+2

您可能會誤解'Promise '的含義。它只是意味着承諾解決了沒有價值(或值'未定義',如果你喜歡這樣想)。這是一個正常的,可鏈接的承諾。除非你使用的承諾庫是奇怪的,而不是A +兼容? – GregL

+0

這些評論中的任何一條都提出了一種在承諾解決後運行測試的方法,無需包裝承諾?無論出於何種原因,@GregL在'Promise '上執行'then()'不起作用。 –

回答

0

您可以嘗試改變wrapUnchainedPromise如下:

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

恐怕這是行不通的,因爲'Promise '不能分配給'Promise '。 –

相關問題