Typescript 測試驅動開發 TDD (12)
Jest模擬 (Jest mocks)
在測試我們的代碼時,我們經常遇到這樣的情況:我們希望確保某個特定函數被調用,或者它被使用正確的參數進行了調用。當一個特定函數按順序調用其他函數以執行一些業務邏輯時,這種情況最常見。例如,我們可能會調用一個初始化函數,并且該初始化函數可能會調用多個REST服務來加載數據。在為我們的初始化函數編寫測試時,我們希望確保所有對REST服務的調用都已完成。為了確保函數被調用,我們使用Jest模擬技術。
作為我們可以使用Jest模擬的一個示例,請考慮以下類:
1 class MyCallbackClass { 2 executeCallback( 3 value: string, 4 callbackfn: (value: string) => null 5 ) { 6 console.log(`executeCallback invoking callbackFn`); 7 callbackFn(value); 8 } 9 }
這里,我們有一個名為MyCallbackClass的類,它有一個名為executeCallback的方法。executeCallback函數接受兩個參數,類型分別為字符串的value和callbackFn。executeCallback方法將一個值記錄到控制臺,并調用傳入的回調函數以及傳入的字符串值。
讓我們來看一下如何使用Jest模擬函數作為callbackFn參數,如下所示:
1 it("should mock callback function", () => { 2 let mock = jest.fn(); 3 4 let myCallbackClass = new MyCallbackClass(); 5 myCallbackClass.executeCallback('test', mock); 6 7 expect(mock).toHaveBeenCalled(); 8 });
在這里,我們通過創建一個名為mock的變量來開始我們的測試,該變量被賦值為調用jest.fn函數的結果。jest.fn函數實際上創建了一個模擬函數,可以作為回調函數的快速替代品使用。
我們的測試然后創建了一個名為myCallbackClass的MyCallbackClass實例,
然后調用executeCallback方法,將字符串值'test'和我們的模擬函數作為參數傳入。
然后我們在這個模擬函數實例上使用toHaveBeenCalled匹配器,
它會測試executeCallback方法是否真正調用了我們作為參數傳入的回調函數。
我們還可以檢查傳入的參數作為參數調用的函數是否使用了正確的參數,如下所示:
1 if("should call testFunction with argument using mock", () => { 2 let mock = jest.fn(); 3 4 let myCallbackClass = new MyCallbackClass(); 5 myCallbackClass.executeCallback("argument_1", mock); 6 expect(mock).toHaveBeenCalledWith("argument_1"); 7 });
在這里,我們使用的是 toHaveBeenCalledWith 匹配器,而不是之前測試中使用的 toHaveBeenCalled 匹配器。這樣可以讓我們檢查傳入作為參數的函數是否以正確的參數被調用。
Jest模擬是一種快速方便的創建回調函數的方式。

浙公網安備 33010602011771號