在项目中使用常量时,有时需要更改它们的值以测试不同的场景。然而,直接导入的常量不能轻易被覆盖,这会使测试创建变得困难。在本文中,我们将了解如何使用 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中文网其他相关文章!