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

如何在Jest中Mock Sequelize链式函数?Query2 Mock失败求助

Jest中Mock Sequelize链式调用失败问题

Query 1的findAll Mock可成功,但Query 2的sequelize.query始终Mock失败,报错如下:

业务代码(something.service.ts)

// Query 1
await this.table2.findAll<table2>({
  attributes: [
    'field1'
  ],
  where: {
    id: someId
   },
});

// Query 2(预期返回[])
let bill1: any = await this.table2.sequelize.query(`
     SELECT
       aa.field1,
       bg.field2
     FROM
       table1 aa,
       table2 bg
     WHERE
       bg.id = '${billId}'
     AND 
       aa.id = bg.aggr_id;
`);

测试代码(something.service.spec.ts)

beforeEach(async () => {
    const module = await Test.createTestingModule({
      providers: [
        {
          provide: getModelToken(table2),
          useValue: {
            // Query1的Mock成功
            findAll: jest.fn(() => [{}]),
            
            // Query2的Mock失败
            sequelize: jest.fn().mockReturnValue([]),
            query: jest.fn().mockReturnValue([]),
            'sequelize.query': jest.fn().mockReturnValue([]),
          },
        }
      ],
    }).compile();

报错信息

TypeError: this.table2.sequelize.query is not a function

已尝试的无效Mock写法

sequelize: jest.fn().mockReturnValue([]),
query: jest.fn().mockReturnValue([]),
'sequelize.query': jest.fn().mockReturnValue([]),
sequelize: jest.fn().mockReturnValue({
                query: jest.fn(() => [])
            })

解决方案

问题根源在于业务代码中this.table2.sequelize是一个实例对象,而非可调用的函数。你需要直接将其Mock为包含query方法的对象,而非用jest.fn()包装。

修改测试代码中的useValue配置:

{
  provide: getModelToken(table2),
  useValue: {
    findAll: jest.fn(() => [{}]),
    // 正确Mock方式:sequelize是对象,内部包含query的jest mock
    sequelize: {
      query: jest.fn().mockReturnValue([])
    }
  },
}

这样this.table2.sequelize.query就能正确指向Mock的函数,解决报错问题。

内容的提问来源于stack exchange,提问作者Kaushik Kakdey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:01:35