在 Jest 中编写手动模拟时,如何输入调用 genMockFromModule 的结果?

evi*_*ing 5 typescript reactjs jestjs

这是我的目录的orders外观。我想测试一个使用orders/helpers手动 Jest 模拟的函数。

orders
  __mocks__
    helpers.ts
  __tests__
    orders.ts
  helpers.ts
  orders.ts
Run Code Online (Sandbox Code Playgroud)

我正在orders/helpers.ts导出一个简单的函数:

export const addIdToOrder = (order: Omit<NewOrderState, 'id'>): Order =>
  ({
    ...order,
    id: v4(),
  } as Order);
Run Code Online (Sandbox Code Playgroud)

我可以如下orders/__tests__/orders.ts模拟该模块orders/helpers:

const MOCK_ID = 'test-id-1234';
// mock addIdToOrder so we can have a deterministic id in tests
jest.mock('../helpers', () => ({
  __esModule: true,
  addIdToOrder: (order: Omit<NewOrderState, 'id'>): Order =>
    ({
      ...order,
      id: MOCK_ID,
    } as Order),
}));
Run Code Online (Sandbox Code Playgroud)

但是,现在我需要添加另一个测试文件,它还需要从 模拟这个函数orders/helper,所以我添加orders/__mocks__/helpers并尝试在那里定义模拟。这是我到目前为止所拥有的:

const helpers = jest.genMockFromModule('../helpers');

export const MOCK_ID = 'test-id-09e26f6a-48cc-4754-bb54-22043adbe2ea';

helpers.addIdToOrder = (order: Omit<NewOrderState, 'id'>): Order =>
  ({
    ...order,
    id: MOCK_ID,
  } as Order);
Run Code Online (Sandbox Code Playgroud)

那里有一个错误helpers.addToOrder:

错误:(8, 1) TS2571:对象的类型为“未知”。

我该如何打字helpers?我可以做类似的事情import * as helpers from '../helpers',然后以某种方式从该模块获取导出对象的类型吗?我怎么做?

现在我正在输入 helpers as any,这会删除所有 TS 错误,但我不想这样做。

小智 4

您可以使用关键字捕获类型typeof。

import * as helpers from '../helpers'

type HelpersType = typeof helpers;
const helpers = jest.genMockFromModule<HelpersType>('../helpers');
Run Code Online (Sandbox Code Playgroud)