Jest - 用于特定测试的模拟 const 变量

问题描述 投票:0回答:1

我正在尝试为特定测试模拟一些具有特定值的常量值。例如我尝试这样做:

env.ts

export const VAR1: number = 1;
export const VAR2: number = 2;

函数.ts

import { VAR1, VAR2 } from "./env";

export function sum(): number {
   return VAR1 + VAR2;
}

功能.规格.ts

import { sum } from "../src/function";

jest.mock("../src/env", () => ({
   VAR1: 10,
   VAR2: 20,
}));

describe("module", () => {
  beforeEach(() => {
    jest.resetModules();
  });
  test("THIS TEST WORKS FINE", () => {
    expect(sum()).toBe(30);
  });

  test("THIS TEST DOESN'T NOT WORK, sum() IS RETURNING 30", () => {
     jest.mock("../src/env", () => ({
        VAR1: 100,
        VAR2: 200,
     }));
     expect(sum()).toBe(300);
  });
});

第一个测试工作正常,但第二个测试仍然使用值 10 和 20。它没有使用本地模拟。

对于模拟特定测试的 const 值有什么建议吗?

提前致谢!

jestjs ts-jest
1个回答
0
投票

因此,首先, const 不应该能够被更改,因此模拟对它们的更改似乎没有什么意义。但更重要的是,这向您展示了 TDD 的一个关键优势——它暴露了设计中需要修复的问题。如果方法需要能够获取不同的值并根据它们进行计算,则应通过依赖项注入提供这些值。在这种情况下,这可能应该是构造函数注入。

// utils.ts
export const sum = (a: number, b: number) => a + b

...

describe('utils', () => {
    it('should add two numbers', () => {
       expect(sum(100, 200)).toBe(300)
    })
}

依靠事实 .env 有自己的测试,并构建您的代码以使您的测试更易于编写 - 这将使其更普遍有用和灵活 - 因为您也可以将它用于不存在的值来自环境变量或来自不同的环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.