首頁 >web前端 >js教程 >使用 Jest 測試中的模擬常數:一個實際範例

使用 Jest 測試中的模擬常數:一個實際範例

Barbara Streisand
Barbara Streisand原創
2025-01-11 08:53:42321瀏覽

Mockando Constantes em Testes com Jest: Um Exemplo Prático

在專案中使用常數時,有時需要更改它們的值以測試不同的場景。然而,直接導入的常數不能輕易被覆蓋,這會使測試創建變得困難。在本文中,我們將了解如何使用 Jest 動態模擬常數,確保測試隔離且可靠。

讓我們建立一個名為 adjustmentImageQuality 的虛構範例,在其中我們根據是否處於生產環境中來調整影像的品質。


執行

常數.js 文件

我們定義一個名為 IS_Production 的常數,指示我們是否處於生產環境:

// constants.js
export const IS_PRODUCTION = false;

調整ImageQuality.js 文件

現在,我們建立 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)。

adjustmentImageQuality.test.js 文件

我們使用 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);
});

模擬講解

1. 建立模擬

我們使用jest.mock來攔截constants模組。在其中,我們使用 jest.requireActual 來取得實際的導出,並為常數 IS_Production 新增一個 getter。

jest.mock("./constants", () => {
  const constants = jest.requireActual("./constants");
  return {
    ...constants,
    get IS_PRODUCTION() {
      return mockIsProduction();
    },
  };
});

2. 嘲笑 IS_Production 的值

在每個測試中,我們使用mockReturnValue來模擬IS_Production的不同值:

  • 用於生產的mockIsProduction.mockReturnValue(true)。
  • 用於開發的mockIsProduction.mockReturnValue(false)。

3. 使用mockClear進行清理

在每次測試之前,我們都會清除模擬狀態以確保它不會幹擾其他測試:

beforeEach(() => {
  mockIsProduction.mockClear();
});

結論

這種常數模擬模式可讓您動態控制應用程式邏輯中使用的值,確保測試的隔離和可靠。當您需要測試基於全域變數、配置或系統狀態的行為時,它特別有用。

透過這種方法,您可以覆蓋複雜的場景,而不會影響程式碼結構或添加不必要的外部依賴項。

以上是使用 Jest 測試中的模擬常數:一個實際範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn