在專案中使用常數時,有時需要更改它們的值以測試不同的場景。然而,直接導入的常數不能輕易被覆蓋,這會使測試創建變得困難。在本文中,我們將了解如何使用 Jest 動態模擬常數,確保測試隔離且可靠。
讓我們建立一個名為 adjustmentImageQuality 的虛構範例,在其中我們根據是否處於生產環境中來調整影像的品質。
我們定義一個名為 IS_Production 的常數,指示我們是否處於生產環境:
// constants.js export const IS_PRODUCTION = false;
現在,我們建立 adjustmentImageQuality 函數。只有當系統處於生產狀態時,它才會改變影像品質:
// adjustImageQuality.js import { IS_PRODUCTION } from "./constants"; export default function adjustImageQuality(img) { if (IS_PRODUCTION) { img.quality = 100; // Qualidade máxima em produção } else { img.quality = 50; // Qualidade reduzida em desenvolvimento } return img; }
我們想要測試 adjustmentImageQuality 在兩個場景下的行為:生產 (IS_Production = true) 和開發 (IS_Production = false)。
我們使用 Jest 動態模擬 IS_Production 的值。秘密是使用 jest.mock 並使用自訂 getter 覆蓋常數。
// adjustImageQuality.test.js import adjustImageQuality from "./adjustImageQuality"; // Mock para a constante IS_PRODUCTION const mockIsProduction = jest.fn(); jest.mock("./constants", () => { const constants = jest.requireActual("./constants"); return { ...constants, get IS_PRODUCTION() { return mockIsProduction(); }, }; }); beforeEach(() => { mockIsProduction.mockClear(); // Limpa os mocks antes de cada teste }); test("sets image quality to 100 in production", () => { // Configura o mock para retornar true (produção) mockIsProduction.mockReturnValue(true); const img = { quality: 0 }; const result = adjustImageQuality(img); expect(result.quality).toEqual(100); }); test("sets image quality to 50 in development", () => { // Configura o mock para retornar false (desenvolvimento) mockIsProduction.mockReturnValue(false); const img = { quality: 0 }; const result = adjustImageQuality(img); expect(result.quality).toEqual(50); });
我們使用jest.mock來攔截constants模組。在其中,我們使用 jest.requireActual 來取得實際的導出,並為常數 IS_Production 新增一個 getter。
jest.mock("./constants", () => { const constants = jest.requireActual("./constants"); return { ...constants, get IS_PRODUCTION() { return mockIsProduction(); }, }; });
在每個測試中,我們使用mockReturnValue來模擬IS_Production的不同值:
在每次測試之前,我們都會清除模擬狀態以確保它不會幹擾其他測試:
beforeEach(() => { mockIsProduction.mockClear(); });
這種常數模擬模式可讓您動態控制應用程式邏輯中使用的值,確保測試的隔離和可靠。當您需要測試基於全域變數、配置或系統狀態的行為時,它特別有用。
透過這種方法,您可以覆蓋複雜的場景,而不會影響程式碼結構或添加不必要的外部依賴項。
以上是使用 Jest 測試中的模擬常數:一個實際範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!