首页 >web前端 >js教程 >使用 Jest 测试中的模拟常量:一个实际示例

使用 Jest 测试中的模拟常量:一个实际示例

Barbara Streisand
Barbara Streisand原创
2025-01-11 08:53:42340浏览

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