Typeorm 玩笑嘲笑

ost*_*jan 7 unit-testing typescript jestjs typeorm ts-jest

我正在尝试在 Jest 中模拟 Typeorm 模块功能之一,并且我想以最干净的方式来完成它。我设法创建的有效内容:

jest.mock("typeorm", () => ({
    __esModule: true,
    getCustomRepository: jest.fn(),
    PrimaryGeneratedColumn: jest.fn(),
    Column: jest.fn(),
    CreateDateColumn: jest.fn(),
    UpdateDateColumn: jest.fn(),
    Entity: jest.fn(),
    EntityRepository: jest.fn(),
    Repository: jest.fn(),
}));
Run Code Online (Sandbox Code Playgroud)

但我只想模拟getCustomReposity,当我只为该函数留下模拟时:

jest.mock("typeorm", () => ({
    __esModule: true,
    getCustomRepository: jest.fn(),
}));
Run Code Online (Sandbox Code Playgroud)

测试甚至无法运行,因为实体和存储库使用了 Typeorm 中的一些装饰器和类。我还尝试为整个模块生成模拟:

jest.mock("typeorm", () => jest.createMockFromModule("typeorm"));
Run Code Online (Sandbox Code Playgroud)

我收到生成的模拟装饰器错误:

TypeError: decorator is not a function
    2 |
    3 | @Entity({ name: "users" })
  > 4 | export class User {
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以比我更干净地创建这样的模拟?

hoa*_*gdv 7

您的代码需要的不仅仅是您模拟的内容。

如果你嘲笑

jest.mock("typeorm", () => ({
    __esModule: true,
    getCustomRepository: jest.fn(),
}));
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中,import { Entity} from 'typeorm';nowEntiry是未定义的。除 之外的其他属性都相同getCustomRepository

您可以使用第一个解决方案解决该问题,或者只是模拟您想要模拟的内容并返回另一个属性作为实际逻辑。

jest.mock('typeorm', () => {
  const actual = jest.requireActual('typeorm');
  return {
    ...actual,
    getCustomRepository: jest.fn(),
  }
});

Run Code Online (Sandbox Code Playgroud)

或者模拟 的所有属性typeorm

jest.mock('typeorm');
Run Code Online (Sandbox Code Playgroud)