如何在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
相关产品推荐
相关产品推荐

