S
Shih, Cheng-Fu8 個月前

在Jest中只mock模組部分method


在開發過程中,我們經常需要對一些外部模組或函式進行模擬,以便更好地控制和測試代碼的行為。本文將介紹如何在 Jest 中模擬一個模組的同時,使用jest.requireActual 來恢復部分不需要模擬的實現。

背景

假設我們有一個名為@module/test 的模組,其中包含三個函式funcfunc2func3。在某些測試場景中,我們可能只想模擬func 函式,而保留func2func3 的原始實現。這樣可以讓我們在測試特定功能時,不受其他函式行為的影響。



// @module/test
export const func = () => "Testing Function";
export const func2 = () => "Testing Function 2";
export const func3 = () => "Testing Function 3";

// Testing
import { func } from "@module/test"; // Step 1

// Step 2
jest.mock("@module/test", () => {
    const originalModule = jest.requireActual<typeof import("@module/test")>("@module/test"); // Step 3
    return {
        ...originalModule,
        func: jest.fn<typeof func>()
    };
});

// Step 4. 
jest.mocked(func).mockImplementation(() => "mocked function");

步驟說明

步驟 1:導入目標函式

首先,從目標模組中導入你想要模擬的函式。

步驟 2:模擬模組

使用jest.mock 方法來模擬整個模組。

步驟 3:使用 jest.requireActual 恢復不必要的模擬

jest.mock 回調函式中,使用jest.requireActual 來獲取模組的原始實現,並保留我們不想模擬的函式。接著,將原始模組與模擬函式合併,僅對func 函式進行模擬。

步驟 4:定義模擬函式的實現

最後,定義func 函式的模擬實現。這樣,在測試中調用func 時,將使用我們提供的模擬實現,而func2func3 將保持其原始行為。

結論

通過上述步驟,我們可以在 Jest 中靈活地模擬模組中的特定函式,同時保留其他函式的原始實現。這種方法雖然稍顯複雜,但它為我們提供了完全的控制能力,允許在不影響整體測試穩定性的前提下,對特定功能進行精準測試。


圖片
圖片
圖片
圖片
圖片
圖片
(使用 Facebook 留言外掛程式 留言無法滿足本網站參加活動之資格,僅供非會員討論使用)
互動地圖
interactive taiwan map