如何在NestJS的Jest测试中模拟带关联的Sequelize模型?
解决NestJS测试中关联模型的模拟问题
1. 先修复模块路径解析错误
错误提示找不到src/subscription/models/subscription.model,大概率是测试环境的路径别名未配置。打开jest.config.js,添加模块别名映射,确保测试时能正确解析src/开头的导入路径:
module.exports = { // 保留原有配置 moduleNameMapper: { '^src/(.*)$': '<rootDir>/src/$1', }, };
2. 模拟所有关联的模型
你的InvoiceModel关联了SubscriptionModel和TransactionModel,仅模拟InvoiceModel不足以让TypeORM处理关联关系,必须把所有关联的模型都加入测试模块的提供者列表:
// 定义所有需要的模拟模型(根据Service实际使用的方法,可扩展模拟逻辑) const mockInvoiceModel = {}; const mockSubscriptionModel = {}; const mockTransactionModel = {}; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ InvoiceService, { provide: getModelToken(InvoiceModel), useValue: mockInvoiceModel }, { provide: getModelToken(SubscriptionModel), useValue: mockSubscriptionModel }, { provide: getModelToken(TransactionModel), useValue: mockTransactionModel }, ], }).compile(); });
3. 按需扩展模拟方法(可选)
如果你的InvoiceService用到了模型的关联查询(比如findOne带include),可以给模拟对象添加对应的方法,让测试逻辑更贴合实际:
const mockInvoiceModel = { findOne: jest.fn().mockResolvedValue({ id: 'test-invoice-uuid', subscriptionId: 'test-sub-uuid', subscription: { id: 'test-sub-uuid', name: '测试订阅' }, payments: [], }), };
内容的提问来源于stack exchange,提问作者colonel balthazar
相关产品推荐
相关产品推荐

