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)
有没有一种方法可以比我更干净地创建这样的模拟?
您的代码需要的不仅仅是您模拟的内容。
如果你嘲笑
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)