Typescript 測試驅動開發 TDD (15)
異步測試 (Asynchronous tests)
正如我們在探索JavaScript和TypeScript時所看到的,我們編寫的大部分代碼都是異步的。這意味著我們無法準確控制回調函數何時被調用,或者Promise何時解析,因為我們正在等待一個超出我們控制范圍的事件發生。這經常在單元測試中引起問題,在這種情況下,我們需要等待異步事件完成后才能繼續進行測試。以下是一個示例類:
1 class MockAsync { 2 executeSlowFunction( 3 complete: (value: string) => void 4 ) { 5 setTimeout(() => { 6 complete(`competed`); 7 },1000); 8 } 9 }
在這里,我們有一個名為MockAsync的類,它有一個名為executeSlowFunction的方法。該方法接受一個名為complete的回調函數作為唯一參數,并在1秒后調用它。我們可以按照以下方式編寫對這個類的測試:
1 describe("failing async tests", () => { 2 it("should wait for callback to complete", () => { 3 let mockAsync = new MockAsync(); 4 console.log(`1. calling executeSlowFunction`); 5 let returnValue !: string; 6 mockAsync.executeSlowFunction((value: string) => { 7 console.log(`2. complete called`); 8 returnedValue = value; 9 }); 10 11 }) 12 });
在這里,我們有一個名為"failing async tests"的測試套件,以及一個名為"should wait for callback to complete"的測試。該測試首先創建了一個名為mockAsync的MockAsync類實例。然后它向控制臺輸出一條消息,并創建了一個變量named returnedValue來保存調用executeSlowFunction方法時返回的值。接下來,它調用executeSlowValueFunction函數并定義了一個回調函數。這個回調函數向控制臺輸出一條消息,并將回調返回的值存儲在returnedValue變量中。然后,該測試向控制臺輸出第三條消息,并檢查returnedValue變量是否包含字符串值"completed"。
運行此測試,然而,會得到以下的失敗輸出:

在這里,我們可以看到打印到控制臺的消息是"1. calling executeSlowFunction"和"3. checking return value"。我們完全沒有收到消息"2. executeSlowFunctionReturned"。我們的測試也失敗了,因為返回值變量expectedValue應該是 "completed",但實際上是undefined的。
導致這個測試失敗的原因是測試本身沒有等待1秒鐘,以便executeSlowFunction函數調用完成回調。我們真正需要的是一種信號方式,告訴我們的測試只有在異步調用完成后才執行測試期望值。

浙公網安備 33010602011771號