You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:11:19