如何使用 TypeScript 和 jest.requireActual() (带有命名导出)?

mik*_*ana 3 unit-testing mocking typescript jestjs

我有一个名为的简单文件functions.ts,其中包含:

export const log = console.log.bind(console);
Run Code Online (Sandbox Code Playgroud)

__mocks__/functions.ts以及从Jest requireActual() 文档借用的一个玩笑模拟:

const originalModule = jest.requireActual("./functions");

// Quiet functions.log() during tests
export default {
  __esModule: true, // Use it when dealing with esModules
  ...originalModule,
  log: jest.fn(),
};
Run Code Online (Sandbox Code Playgroud)

我希望使该log()函数无用,即该函数不执行任何操作(人们过去称之为无操作)。

import { runMe } from "./stackoverflow";

jest.mock("./src/backend/functions");

test(`pass, but make sure it doesn't log error messages`, () => {
  runMe();
  expect(true).toBeTruthy();
});

Run Code Online (Sandbox Code Playgroud)

实际运行的函数是:

import { log } from "./src/backend/functions";

export const runMe = () => {
  console.log(`log is:`, log);
  log(`Hello`);
};
Run Code Online (Sandbox Code Playgroud)

console.log(`log is:`, log);
Run Code Online (Sandbox Code Playgroud)

返回log is: undefined

如果我删除它,一切都会完美(但仍然记录)jest.mock("./src/backend/functions");

如何使用 TypeScript 和 jest.requireActual()?即,当我运行它们时,测试runMe()会很安静(但其他功能仍然functions正常工作)?

小智 8

如果您想jest.requireActual与类型一起使用,只需将导入的类型作为参数传递即可。

像这样的东西应该有效:

import { log } from './functions';

jest.mock('./functions', () => ({
    ...jest.requireActual<typeof import('./functions')>('./functions'),
    log: jest.fn(),
}));

Run Code Online (Sandbox Code Playgroud)