将常见的模拟代码移动到包含 Jest 手动模拟的单独文件中

lon*_*nix 5 unit-testing mocking node.js typescript jestjs

我在很多地方都使用了一个模拟,所以我想把它移到一个可以重复使用的单独文件中。

我认为 Jest 称其为“手动模拟”。但是我不想使用__mocks__约定。

被测试文件的顶部:

import * as dotenvSafe from "dotenv-safe";
Run Code Online (Sandbox Code Playgroud)

手动模拟文件:

const dotenvSafe: any = jest.genMockFromModule("dotenv-safe");

dotenvSafe.load = jest.fn(() => {     // the function I want to mock
  return {
    error: undefined,
    parsed: [],
  };
});

export default dotenvSafe;
Run Code Online (Sandbox Code Playgroud)

在测试文件的顶部,我尝试了各种方法:

  1. jest.setMock("dotenv-safe", "../../mocks/dotenv-safe");
    不起作用。被测试的代码获取"../../mocks/dotenv-safe.mock"而不是模块。

  2. jest.mock("dotenv-safe", () => require("../../mocks/dotenv-safe"));
    不起作用 - 被测试的代码抛出TypeError: dotenvSafe.load is not a function.

  3. jest.mock("dotenv-safe", () => { return { load: jest.fn(() => ({error: undefined, parsed: []})) }; });
    行得通!但是模拟是内联的,我想将它移动到一个单独的文件中。我不想在每个文件中重复这一点。

什么是正确的语法?

Est*_*ask 6

require("../../mocks/dotenv-safe")等于模块导出。使用的是默认导出,因此应该是:

jest.mock("dotenv-safe", () => require("../../mocks/dotenv-safe").default);
Run Code Online (Sandbox Code Playgroud)