如何克服开玩笑“初始化前无法访问”的问题?

lch*_*lch 6 javascript jestjs

设置.js

export default {
  web: {
    a: 1
  },
  mobile: {
    b: 2
  }
};
Run Code Online (Sandbox Code Playgroud)

获取设置.js

import settings from "./settings";

export const getSetting = platform => {
  return settings[platform];
};
Run Code Online (Sandbox Code Playgroud)

getSettings.test.js

import { getSetting } from "./getSetting";

const TEST_SETTINGS = { c: 3 };

jest.mock("./settings", () => {
  return {
    test: TEST_SETTINGS
  };
});

test("getSetting", () => {
  expect(getSetting("test")).toEqual(TEST_SETTINGS);
});
Run Code Online (Sandbox Code Playgroud)

错误

ReferenceError: Cannot access 'TEST_SETTINGS' before initialization
Run Code Online (Sandbox Code Playgroud)

我相信这与吊装有关。有没有办法克服这个问题?玩笑是否提供任何其他方法来实现这一目标?

我不想这样做。当模拟数据很大并且在多个测试中使用时,这并不好。

jest.mock("./settings", () => {
  return {
    test: { c: 3 }
  };
});

expect(getSetting("test")).toEqual({ c: 3 });
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 6

jest.mock自动提升,这会导致在TEST_SETTINGS声明之前评估模拟模块。

此外,这会导致./settings使用命名导出来模拟test,而预计它会具有默认导出。

它不应该使用临时变量,该值在导入时可用:

import settings from "./settings";

jest.mock("./settings", () => {
  return { default: {
    test: { c: 3 }
  } };
});

...

expect(getSetting("test")).toBe(settings.test);
Run Code Online (Sandbox Code Playgroud)